- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 JavaScript 应用程序,我想知道是否通过删除所有“use strict;”程序中的语句,我会以某种方式改变它的行为。
据我所知,严格模式不允许某些东西,一旦应用程序完成开发,我可以将其删除而不会造成任何副作用。
还有提到的'this'变量的情况here但 Chrome 直到现在似乎还没有实现这种行为。
谢谢!
最佳答案
在某些情况下,您的代码可能会受到影响,尽管其中大多数是人为设计的:
当传递 null
或 undefined
作为 this
值时(在非严格模式下,this 被转换为全局对象,不是空对象):
'use strict';
(function () {
if (!this) console.log('performs proper actions');
else console.log('fail! oops...');
}).call(undefined); // 'performs proper actions'
在严格模式下,这将记录“执行正确的操作”
。但是,这在非严格模式下并不相同,您会收到失败消息:
(function () {
if (!this) console.log('performs proper actions');
else console.log('fail! oops...');
}).call(undefined); // 'fail! oops...'
如果您使用 null
而不是 undefined
,它也会有相同的行为。
如果您的函数依赖于未被强制转换为对象的 this
值——在非严格模式下,this
被隐式转换为对象。例如,false
、'Hello World!'
、NaN
、Infinity
和 1
将被强制转换为其等效的对象包装器(如前所述,null
和 undefined
有它们自己的行为)。比较严格模式下发生的情况:
'use strict';
(function () { console.log(this); }).call(1); // 1
...在非严格模式下发生的事情:
(function () { console.log(this); }).call(1); // '[object Number]'
当依赖形式参数和 arguments
对象不在分配时共享它们的值时:
function strict(a, b, c) {
'use strict';
var a = 1;
var b = 2;
var c = 3;
var d = 4;
console.log('strict: ' + (arguments[0] === a ? 'same' : 'different')); // different
console.log('strict: ' + (arguments[1] === b ? 'same' : 'different')); // different
console.log('strict: ' + (arguments[2] === c ? 'same' : 'different')); // different
console.log('strict: ' + (arguments[3] === d ? 'same' : 'different')); // of course they're different; by design
}
function notStrict(a, b, c) {
var a = 1;
var b = 2;
var c = 3;
var d = 4;
console.log('non-strict: ' + (arguments[0] === a ? 'same' : 'different')); // same
console.log('non-strict: ' + (arguments[1] === b ? 'same' : 'different')); // same
console.log('non-strict: ' + (arguments[2] === c ? 'same' : 'different')); // same
console.log('non-strict: ' + (arguments[3] === d ? 'same' : 'different')); // of course they're different; by design
}
strict(0, 1, 2, 3);
notStrict(0, 1, 2, 3);
得到的结果如下:
strict: different
strict: different
strict: different
strict: different
non-strict: same
non-strict: same
non-strict: same
non-strict: different
如果您一直在使用eval
并直接调用它,您会发现在eval
调用内部声明的变量和函数被泄露到周围范围,而不是在严格模式下处于自己的范围内。例如,a
在严格模式下保留其原始值:
'use strict';
var a = 42;
eval('var a = -Infinity;');
console.log(a); // 42
...在非严格模式下,它被分配了一个新值:
var a = 42;
eval('var a = -Infinity;');
console.log(a); // -Infinity
如果您依赖于正在创建的新范围,这将是对您的代码的重大更改。
如果您故意使用在尝试分配给尚 undefined variable 时抛出 ReferenceError
的方式,这将影响您的代码运行方式:
try {
randomVariableThatHasntBeenDefined = 1;
} catch (e) {
alert('performs logic');
}
警报不会在非严格模式下显示。
所有这些都可以在 Annex C 中找到的 ECMAScript 5.1 Specification ,这是每个案例中发生的事情的权威引用。虽然这不是很容易阅读,但它对于理解特定的极端情况以及它们为何如此行事可能很有用。
关于javascript - 可以移除严格模式而没有副作用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19750229/
我正在做一个项目,我的 android 在这个项目中作为一个网络服务器工作;输入带端口号的 IP 地址,打开 Web 界面,用户可以将文件上传到手机。我想在 Web 界面上显示一些图片,以便我们的界面
我是一名优秀的程序员,十分优秀!