//Global Scope
"use strict"; //1
function A() {
"use strict"; //2
function innerA() {
"use strict"; //3
}
}
我想知道:
在
//1
处执行use strict
是否就足够了,还是需要在所有地方都显式指定,如//2
和//3
。
//Global Scope
"use strict"; //1
function A() {
"use strict"; //2
function innerA() {
"use strict"; //3
}
}
我想知道:
在
//1
处执行use strict
是否就足够了,还是需要在所有地方都显式指定,如//2
和//3
。
引用MDN关于严格模式的内容,
为整个脚本调用严格模式,请在任何其他语句之前放置确切的语句
"use strict";
(或'use strict';
)。连接严格和非严格脚本存在问题。因此,建议您逐个函数启用严格模式。
因此,将其放在顶部适用于整个文件。您不必在每个函数中明确提及它。
注意:在顶部使用use strict
也有其自身的问题。请在链接的MDN页面中阅读有关它们的信息。因此,根据MDN的建议,
您还可以采用将脚本的整个内容包装在一个函数中,并使该外部函数使用严格模式的方法。这消除了连接问题,但这意味着您必须显式导出任何全局变量以超出函数范围。
'use strict';
(function () {
return {
1: 1,
1: 2
};
})();
但是,当你像这样做时语法错误:严格模式下不允许对象文字中的重复数据属性
(function () {
return {
1: 1,
1: 2
};
})();
(function () {
'use strict';
return {
1: 1,
1: 2
};
})();
它只会在第二个函数中失败,而不会在第一个函数中失败。因为,只有第二个函数是在严格模式下执行的。
另外,如果你有一个函数内嵌在另一个函数中,就像你在问题中展示的那样,
(function () {
'use strict';
(function () {
return {
1: 1,
1: 2
};
})();
})();
但是,如果你在{}
内的块中使用use strict
,它将没有任何效果,例如:
(function () {
{
'use strict';
return {
1: 1,
1: 2
};
}
})();
或者
console.log("");
'use strict';
var a = {
1: 1,
1: 2
};
不会抛出任何错误。
use strict
。只有这样,代码才会进入严格模式。仅在//1
定义它就足够了。这是直接从《JavaScript权威指南》摘录的(我加了强调):
如果脚本有"use strict"指令,则脚本的顶层(非函数)代码是严格模式代码。如果函数体在严格模式代码中定义或具有"use strict"指令,则函数体是严格模式代码。