1.消除了Javascript句型的一些不合理和不精确的方面,缓解了一些奇怪的行为;
2.使用严格模式
"use strict";
1.严格模式下javascript的严格模式,必须显式声明全局变量。
2、Javascript语言的一个特点是它允许“动态绑定”,即各个对象的各个属性和技术属于哪个对象,不是在编译时确定的,而是在运行时确定的。 严格模式对动态绑定有一些限制。 在某些情况下,只允许静态绑定。 也就是说,对象属性和技能属于哪些对象,是在编译阶段就确定的。 这将有助于提高编译效率,使代码更易于阅读javascript的严格模式,并减少意外情况。
(1) 严禁与句子连用
"use strict";
var v = 1;
with (o){ // 语法错误
v = 2;
}
在正常模式下,Javascript语言有两个变量作用域:全局作用域和函数作用域。 严格模式创建第三个作用域:eval 作用域。
在普通模式下,eval语句的作用域取决于它是在全局作用域还是在函数作用域。 严格模式下,eval语句本身就是一个作用域,不能再生成全局变量。 它生成的变量只能在eval内部使用。
"use strict";
var x = 2;
console.info(eval("var x = 5; x")); // 5
console.info(x); // 2
function f(){
return !this;
}
// 返回false,因为"this"指向全局对象,"!this"就是false
function f(){
"use strict";
return !this;
}
// 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
因此,如果使用构造函数时忘记添加new,this将不再指向全局对象,而是会报错。
function f1(){
"use strict";
f1.caller; // 报错
f1.arguments; // 报错
}
f1();
严禁删除变量
在严格模式下删除变量是很困难的。 仅可删除可配置设置为 true 的对象属性。
"use strict";
var x;
delete x; // 语法错误
var o = Object.create(null, {'x': {
value: 1,
configurable: true
}});
delete o.x; // 删除成功
显示错误
在普通模式下,如果对象的只读属性被正式参数化,则不会报告任何错误,只会默默失败。 严格模式下会报错。
"use strict";
var o = {};
Object.defineProperty(o, "v", { value: 1, writable: false });
o.v = 2; // 报错
严格模式下,如果使用形参通过getter方法读取属性,会报错。
"use strict";
var o = {
get v() { return 1; }
};
o.v = 2; // 报错
"use strict";
var o = {};
Object.preventExtensions(o);
o.v = 1; // 报错
在严格模式下,删除无法删除的属性会导致错误。
"use strict";
delete Object.prototype; // 报错
4.6 重名错误
严格模式有一些新的语法错误。
(1) 对象不能有重名的属性。
在普通模式下,如果一个对象有多个同名属性,最后一个形参的属性会覆盖后面的值。 在严格模式下,这是一个语法错误。
"use strict";
var o = {
p: 1,
p: 2
}; // 语法错误
(2) 函数不能有重名的参数。
"use strict";
function f(a, a, b) { // 语法错误
return ;
}
4.7 严禁使用八补码表示法
"use strict";
var n = 0100; // 语法错误
4.8 参数对象的限制
Arguments是函数的参数对象,严格模式限制了它的使用。
(1) 不允许使用实参形式参数
"use strict";
arguments++; // 语法错误
var obj = { set p(arguments) { } }; // 语法错误
try { } catch (arguments) { } // 语法错误
function arguments() { } // 语法错误
var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
(2)arguments 不再跟踪参数变化
function f(a) {
a = 2;
return [a, arguments[0]];
}
f(1); // 正常模式为[2,2]
function f(a) {
"use strict";
a = 2;
return [a, arguments[0]];
}
f(1); // 严格模式为[2,1]
(3)禁止使用arguments.callee
这意味着,你无法在匿名函数内部调用自身了。
"use strict";
var f = function() { return arguments.callee; };
f(); // 报错