首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript严格模式兼容性

JavaScript严格模式兼容性
EN

Software Engineering用户
提问于 2014-05-12 07:47:52
回答 1查看 184关注 0票数 0

在阅读关于MDN的严格模式的文章时,我真的很惊讶地看到了页面末尾的以下内容,引用如下:

浏览器还没有可靠地实现严格的模式,所以不要盲目地依赖它。严格模式改变语义。依赖这些更改将导致错误和错误的浏览器,而这些浏览器没有实现严格模式。在使用严格模式时要小心,并通过功能测试来支持严格模式,以检查是否实现了严格模式的相关部分。最后,确保在支持和不支持严格模式的浏览器中测试代码。如果您只在不支持严格模式的浏览器中进行测试,则很可能会在不支持严格模式的浏览器中出现问题,反之亦然。

据我所知,严格模式是一组红色的“非粘贴”模式,因此我无法想象在非严格浏览器中严格代码不能正确运行的情况。所以,问题是这句话真的有意义吗?是否有严格的“非严格”切换会使代码无效的情况?

EN

回答 1

Software Engineering用户

发布于 2014-11-22 19:34:41

严格模式不仅仅是从“非严格”模式中减少功能。还有一些改变的功能。假设我们想编写以下ES6代码:

代码语言:javascript
复制
function callOnObjectWithArgs(fn, obj, ...args) {
    fn.apply(obj, args);
}

但是由于浏览器还没有实现rest操作符(.)然而,我们可以在严格的模式下这样做:

代码语言:javascript
复制
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

但是,这段代码不能在“非严格”模式下工作。

代码语言:javascript
复制
// Using callOnObjectWithArgs without the "strict mode"; invocation
callOnObjectWithArgs(console.log, console, 1, 2, 3) // -> TypeError: undefined is not a function

这是因为通过从arguments对象中删除前两个元素,fnobj将不再指向传递给函数的前两个参数,而是指向删除前两个元素(12)之前的arguments[2]arguments[3]。这是因为在“非严格”模式下,命名函数参数总是指向arguments对象中的相应索引,而在严格模式下的命名参数则不以任何方式绑定到arguments对象。

这就是为什么您应该始终编写与严格模式和常规模式兼容的代码。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/238783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档