在严格模式下,在函数中重复声明arguments会报错:
'use strict';
function say() {
var arguments = []; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
}
在非严格模式下,在函数中重复声明arguments不会报错:
function sayWithNoStrict() {
var arguments = [];
}
如果连接两个不同模式的JavaScript文件的话,如果是严格模式的文件放在开始的话,那么整个文件都是处于严格模式的:
// file1.js
'use strict';
function say() {
var arguments = []; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
}
// file2.js
function sayWithNoStrict() {
var arguments = []; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
}
如果连接两个不同模式的JavaScript文件的话,如果是非严格模式的文件放在开始的话,那么整个文件都是处于非严格模式的:
// file2.js
function sayWithNoStrict() {
var arguments = [];
}
// file1.js
'use strict';
function say() {
var arguments = [];
}
因为file1.js和file2.js如果合并到一个文件中的话,那么它们处于同一个作用域中; 这个时候如果在文件的顶部使用use strict的话,那么整个文件都是使用的严格模式; 在文件中间使用use strict是没有作用的。
我们当然也有应对这种情况的解决方案,那就是使用一个立即调用的函数来包裹我们的代码; 达到分离作用域的目的,然后在这个立即执行的函数上方标注我们要使用的模式;如果你想使用严格模式的话, 那就添加use strict;如果不想使用严格模式的话,那就什么也不添加。
(function() {
// file1.js 使用了严格模式
'use strict';
function say() {
}
})();
(function() {
// file2.js 使用非严格模式
function sayWithNoStrict() {
var arguments = [];
}
})();
谨记
决定你的应用程序支持JavaScript的那些版本。
确保你使用的任何JavaScript的特性对于应用程序将要运行的所有环境都是支持的。
总是在执行严格模式检查的环境中测试严格代码。
当心连接那些在不同严格模式下有不同预期的脚本。
参考资料:https://lee134134134.github.io/page/9/