Javascript使用严格模式

javascript May 12, 2018

严格模式(use strict),正如它的名字一样,使用严格的模式进行语法解析。Javascript提供了灵活的功能和方法,但是熟悉Java等强类型语言的开发使用Javascrpit却会显得非常痛苦,过于灵活的语法给Javasciprt带来了一些诟病。

"严格模式"的优点:

  1. 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  2. 消除代码运行的一些不安全之处,保证代码运行的安全;
  3. 提高编译器效率,增加运行速度;
  4. 为未来新版本的Javascript做好铺垫。
注意IE10以下均不支持严格模式。

严格模式(use strict)的使用

严格模式通过在脚本或函数的头部添加"use strict";表达式来声明。

严格模式(use strict)在整个脚本作用域中:

"use strict";
myFunction();

function myFunction() {
    y = 3.14;   // // 报错,严格模式下y必须先定义
}

严格模式(use strict)在函数作用域中:

x = 3.14;       // 不报错,不在严格模式作用域中
myFunction();

function myFunction() {
   "use strict";
    y = 3.14;   //报错,严格模式下y必须先定义
}

使用了严格模式(use strict)在团队合作时会显得更加的友好。

使调试更加容易。那些被忽略或默默失败了的代码错误,会产生错误或抛出异常,因此尽早提醒你代码中的问题,你才能更快地指引到它们的源代码。

变量在赋值之前必须声明,防止意外的全局变量。如果没有严格模式,将值分配给一个未声明的变量会自动创建该名称的全局变量。这是JavaScript中最常见的错误之一。在严格模式下,这样做的话会抛出错误。

取消this值的强制转换。如果没有严格模式,引用null或未定义的值到this值会自动强制到全局变量。在严格模式下,引用null或未定义的this值会抛出错误。严格模式下,this不会指向window

不允许重复的属性名称或参数值。当检测到对象中重复命名的属性,例如:

    var object = {foo: "bar", foo: "baz"};

或检测到函数中重复命名的参数时,例如:

    function foo(val1, val2, val1){}

严格模式会抛出错误,因此捕捉几乎可以肯定是代码中的bug可以避免浪费大量的跟踪时间。

  • 使 eval()更安全。在严格模式和非严格模式下, eval()的行为方式有所不同。最显而易见的是,在严格模式下,变量和声明在 eval()语句内部的函数不会在包含范围内创建(它们会在非严格模式下的包含范围中被创建,这也是一个常见的问题源)。

eval()没有被移除,但它在严格模式下发生了一些变化。最大的改变是:在eval()语句中声明的变量以及函数不会在包含域中创建。例如:

(function() {

eval("var x = 10;");

// 非严格模式下,x为10
// 严格模式下,x没有声明,抛出一个错误
alert(x);
})(); 

任意由eval()创建的变量或函数仍呆在eval()里。然而,你可以通过从eval()中返回一个值的方式实现值的传递:

(function() {

var result = eval("var x = 10, y = 20; x + y");

// 严格模式与非严格模式下都能正常工作(得到30)
alert(result);
}()); 

在 delete 使用无效时抛出错误。 delete 操作符(用于从对象中删除属性)不能用在对象不可配置的属性上。当试图删除一个不可配置的属性时,非严格代码将默默地失败,而严格模式将在这样的情况下抛出异常。

严格模式去除了with语句

不能修改arguments,不能在函数内定义arguments变量  ,不能使用arugment.callerargument.callee。因此如果你要引用匿名函数,需要对匿名函数命名。

(完)

参考链接

什么是“use strict”,好处和坏处

标签

毛俊

探索,热爱,分享。

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.