JavaScript的strict模式与with关键字介绍

 更新时间:2014年02月08日 09:14:46   作者:  
这篇文章主要介绍了JavaScript的strict模式与with关键字,需要的朋友可以参考下
2009年12月,ECMAScript发布了ECMAScript 5,这距离上一个版本的ECMAScript 3标准发布已经整整十年了,其间JavaScript虽然大行于web编程,ECMAScript 4却最终因为利益相关的各大厂商和组织在此语言的复杂性(即是否增加大量特性以扩展ECMAScript的功能)上的分歧而夭折,使得ECMAScript新标准的制订大大落后于编程的实践。ECMAScript 5在目标上没有那么雄心勃勃,除去新增了对JSON的支持和反射的更全面的控制,一项重要改进就是引入“严格模式”(strict mode)。在此模式下,ECMAScript的语法变得更严格,使得原先许多常见的易致错的代码不再被允许,包括强制变量声明和不允许with语句等。采用这种模式很简单,只要在脚本文件或者函数的首行添加"use strict";这样一行字符串就可以了。

笔者后知,2010年还曾写了一篇小文讨论with关键字的缺陷,随附如下。
楔子

很久很久以前,神笔马良的家乡为了纪念他要将一条马路以他的名字命名。马良没有推辞,不过提出了四个字的意见。多年以后,一位外地人来到这里,在这条马路上拦住一个当地人问路。

请问这是神马路?

对,这是神马路。

你也不知道吗?

我就是这的人,怎么会不知道。

那这是神马路?

你知道了还问什么。

我就是不知道这是神马路。

那我不是已经告诉你这是神马路了吗?

你能不能再说一遍这是神马路?

……

过后,这个当地人想起当年神笔马良的意见,恍然大悟。马良说的是——勿用简称。

A Question

One day Tom said to Wang Er, his Chinese friend,“I have a dream. I want to show myself on CCTV.”The next day Tom broke into a neighbor shop. The police didn't take much time to identify and arrest Tom because he was captured very clearly by the shop's CCTV.

The question is when Tom said his dream, he is

A) ambitious B) not ambitious C)ambiguous D) unambiguous

The right answer is B) and C).
正文

以上两个古今中外的例子说明简写有时会引起歧义。这在Javascript中也存在。有时候要反复引用一个名字很长的变量是很麻烦的,比如:

objectWithLongName1.propty1=value1;

objectWithLongName1.propty2=value2;

objectWithLongName1.propty3=value3;

objectWithLongName1.method1();

但是一个清晰的名字对于程序的可读性又是很重要的。所以Javascript提供了with语句。上面的例子可以改写成:
复制代码 代码如下:

with (objectWithLongName1){

propty1=value1;

propty2=value2;

propty3=value3;

method1();

}

这样省去不少敲打键盘的功夫,而且程序的结构也变得更加清晰。但是这样的简写引入了歧义,我们如何知道大括号内的名称,哪些是objectWithLongName1的属性和方法,哪些是外部变量和函数。Javascript的解析规则是,先在objectWithLongName1上查找这些名称的属性,如果没有找到,则认为它们是外部变量。用代码说明就是这样:
复制代码 代码如下:

if(objectWithLongName1.property1!==undefined){

if(objectWithLongName1.value1!==undefined){

objectWithLongName1.property1=objectWithLongName1.value1; //可能1

}else{

objectWithLongName1.property1=value1;//可能2

}

}else{

if(objectWithLongName1.value1!==undefined){

property1=objectWithLongName1.value1; //可能3

}else{

property1=value1;//可能4

}

}

我们希望的是这四种可能性之一,但是一不小心,程序执行的就会是另外一种可能。而且,这样的写法对于程序的读者来说也非常难解。另一方面,对于Javascript解释器,这种不确定性也影响了语言的性能。

其实只要一个小小的改进,就可以祛除这些缺陷。我们可以在省略了对象的属性前面加上点号,这样就在属性和外部变量之间加上了直观的区分,有不少其他语言就是这样做的。我们最初的例子会变成这样:
复制代码 代码如下:

with (objectWithLongName1){

.propty1=value1;

.propty2=value2;

.propty3=value3;

.method1();

}

在Javascript做这样的改进之前,两害相权取其轻,要尽量避免使用with语句。我们仍然可以采用一些变通的方法。
复制代码 代码如下:

var o1= objectWithLongName1;

o1.propty1=value1;

o1.propty2=value2;

o1.propty3=value3;

o1.method1();

或者对于这样的情况:

objectWithLongName1.propty1= objectWithLongName2.propty1;

objectWithLongName1.propty2= objectWithLongName2.propty2;

……

objectWithLongName1.propty10= objectWithLongName2.propty10;

可以写成:
复制代码 代码如下:

(function(o1, o2, pl){

pl.forEach(function(item){o1[item]=o2[item];});

})( objectWithLongName1,objectWithLongName2, [‘propty1', ‘propty2', … , ‘propty10']);

相关文章

  • JavaScript中变量的作用域详解

    JavaScript中变量的作用域详解

    本文详细讲解了JavaScript中变量的作用域,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Javascript学习笔记之 对象篇(三) : hasOwnProperty

    Javascript学习笔记之 对象篇(三) : hasOwnProperty

    判断一个属性是定义在对象本身而不是继承自原型链,我们需要使用从 Object.prototype 继承而来的 hasOwnProperty 方法。 hasOwnProperty 方法是 Javascript 中唯一一个处理对象属性而不会往上遍历原型链的。
    2014-06-06
  • JS Timing

    JS Timing

    JS Timing...
    2007-04-04
  • JavaScript If...Else 声明

    JavaScript If...Else 声明

    JavaScript If...Else 声明...
    2007-04-04
  • 基于JS脚本语言的基础语法详解

    基于JS脚本语言的基础语法详解

    下面小编就为大家带来一篇基于JS脚本语言的基础语法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Javascript 二维数组

    Javascript 二维数组

    Javascript二维数组的实现代码,需要的朋友可以参考下。
    2009-11-11
  • js函数调用常用方法详解

    js函数调用常用方法详解

    js的函数调用会免费奉送两个而外的参数就是 this 和 arguments,我们所知道的应该有4中调用方式吧,接下来将为您详细介绍,感兴趣的朋友可以参考下
    2012-12-12
  • javascript三元运算符用法实例

    javascript三元运算符用法实例

    这篇文章主要介绍了javascript三元运算符用法实例,本文讲解了三元运算符用法实例和编程语言中的三元运算符介绍,需要的朋友可以参考下
    2015-04-04
  • 在JavaScript中使用对数Math.log()方法的教程

    在JavaScript中使用对数Math.log()方法的教程

    这篇文章主要介绍了在JavaScript中使用对数Math.log()方法的教程,是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-06-06
  • Javascript入门学习资料收集整理篇

    Javascript入门学习资料收集整理篇

    为大家更好的接触和学习js资料,所以我转了这篇文章,我大约的看了下,文章写的非常不错,希望大家不要急,慢慢看,第一次看不懂不要紧,多练习就可以了
    2008-07-07

最新评论