在阅读关于MDN的严格模式的文章时,我真的很惊讶地看到了页面末尾的以下内容,引用如下:
浏览器还没有可靠地实现严格的模式,所以不要盲目地依赖它。严格模式改变语义。依赖这些更改将导致错误和错误的浏览器,而这些浏览器没有实现严格模式。在使用严格模式时要小心,并通过功能测试来支持严格模式,以检查是否实现了严格模式的相关部分。最后,确保在支持和不支持严格模式的浏览器中测试代码。如果您只在不支持严格模式的浏览器中进行测试,则很可能会在不支持严格模式的浏览器中出现问题,反之亦然。
据我所知,严格模式是一组红色的“非粘贴”模式,因此我无法想象在非严格浏览器中严格代码不能正确运行的情况。所以,问题是这句话真的有意义吗?是否有严格的“非严格”切换会使代码无效的情况?
发布于 2014-11-22 19:34:41
严格模式不仅仅是从“非严格”模式中减少功能。还有一些改变的功能。假设我们想编写以下ES6代码:
function callOnObjectWithArgs(fn, obj, ...args) {
fn.apply(obj, args);
}但是由于浏览器还没有实现rest操作符(.)然而,我们可以在严格的模式下这样做:
function callOnObjectWithArgs(fn, obj) {
"use strict";
var splice = Array.prototype.splice;
splice.call(arguments, 0, 2); // Remove the first 2 elements (fn & obj)
fn.apply(obj, arguments);
}
callOnObjectWithArgs(console.log, console, 1, 2, 3); // -> 1 2 3但是,这段代码不能在“非严格”模式下工作。
// Using callOnObjectWithArgs without the "strict mode"; invocation
callOnObjectWithArgs(console.log, console, 1, 2, 3) // -> TypeError: undefined is not a function这是因为通过从arguments对象中删除前两个元素,fn和obj将不再指向传递给函数的前两个参数,而是指向删除前两个元素(1和2)之前的arguments[2]和arguments[3]。这是因为在“非严格”模式下,命名函数参数总是指向arguments对象中的相应索引,而在严格模式下的命名参数则不以任何方式绑定到arguments对象。
这就是为什么您应该始终编写与严格模式和常规模式兼容的代码。
https://softwareengineering.stackexchange.com/questions/238783
复制相似问题