严格模式和非严格模式有什么区别:函数
严格模式对正常的 JavaScript语义作了一些更改。
首先,严格模式经过抛出错误来消除了一些原有静默错误。
其次,严格模式修复了一些致使 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式能够比非严格模式下运行得更快。
第三,严格模式禁用了在ECMAScript的将来版本中可能会定义的一些语法。
上文引用了MDN对严格模式的描述优化
1.变量必须声明才能使用(在正常模式中,若是一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种写法)this
2.禁止使用with语句(由于with语句没法在编译时就肯定,属性到底归属于哪一个对象,严格模式有利于编译效率提升)prototype
3.建立eval做用域(正常模式下,js有两种变量做用域,全局做用域和局部做用域,正常模式下eval语句做用域取决于它处于全局做用域仍是函数做用域,严格模式下eval语句自己就是做用域,不可以生成全局变量,所生成的变量只能用于eval内部)code
4.禁止this关键字指向全局对象(严格模式下全局做用域中定义的函数中的this为undefined)。例如:对象
function f(){ return !this; //返回的是false,由于this指向的是全局对象,!对象 == false } function f(){ "use strict" return !this; //返回的是true,由于严格模式下,this的值为undefined,!undefined == true }
5.禁止在函数内部遍历调用栈( caller:调用当前函数的函数的引用,即外层函数的引用; )ip
function f1(){ "use strict"; f1.caller; //报错 f1.arguments; //报错 } f1();
6.严格模式下没法删除变量。只有conifgurable设置为true的对象属性才能被删除作用域
"use strict" var x ; delete x; //严格模式下报语法错误 var o = Object.create(null,{'x':{ value: 1, configurable: true }}) delete o.x; //删除成功
7.显示报错(正常模式下对一个对象的只读属性进行赋值,不会报错,只会默默失败。严格模式下将报错)get
"use strict"; var o = {}; Object.defineProperty(o,"v",{value: 1,writable: false}); o.v = 2; //报错,由于o.v属性是不能被修改的,严格模式会报错,正常模式会失败但不报错
8.严格模式下,对禁止扩展的对象添加新属性,会报错it
"use strict"; var o = {}; Object.preventExtensions(o);//禁止o对象有拓展属性 o.v = 1; //报错
9.严格模式下,删除一个不可删除的属性,报错
"use strict"; delete Object.prototype; //报错
10.对象拥有多个同名属性,严格模式报错。正常模式会默认值为最后一个
11.函数不能有重名的参数,严格模式会报错,正常模式能够经过arguments[i]来获取对应的参数
12.禁止八进制写法,正常状况下整数第一位为0表明八进制,严格模式下整数第一位为0则报错
13.不许对arguments赋值
14.严格模式下的arguments不在追踪参数的变化
function fn(a){ a=2; return [a,arguments[0]]; } fn(1); //正常模式返回值 [2,2] "use strict" function fn(a){ a = 2; return [a,arguments[0]]; } fn(1); //严格模式返回值 [2,1] 参数传进来是多少就是多少,arguments不会变化
15.禁止使用arguments.callee(没法在匿名函数内部调用自身了。arguments.callee指向的就是该函数自己)
var f = function (){ return arguments.callee; } f(); //报错
总结:推荐使用严格模式,由于能让代码更规范,也更利于后期的维护和排除错误。更加严谨。