可以在没有副作用的情况下删除严格模式吗
can strict mode be removed without side-effects
我有一个JavaScript应用程序,我想知道通过删除程序中的所有"use strict;"语句,我是否会以某种方式改变它的行为
据我所知,严格模式不允许一些东西,一旦应用程序完成开发,我就可以删除它而不会产生任何副作用
这里也提到了"this"变量的情况,但Chrome似乎到目前为止还没有实现这种行为
谢谢
在少数情况下,您的代码可能会受到影响,尽管其中大多数都是人为的:
-
当传递
null
或undefined
作为this
值时(在非严格模式下,它被转换为全局对象,而不是空对象(:'use strict'; (function () { if (!this) console.log('performs proper actions'); else console.log('fail! oops...'); }).call(undefined); // 'performs proper actions'
在严格模式下,这将记录
"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
如果您依赖于正在创建的新作用域,这将是对代码的一个突破性更改。
-
如果你故意使用抛出
ReferenceError
的方式,如果你试图分配给一个尚未定义的变量,这将影响你的代码运行方式:try { randomVariableThatHasntBeenDefined = 1; } catch (e) { alert('performs logic'); }
警报将不会在非严格模式下显示。
所有这些都可以在ECMAScript 5.1规范的附录C中找到,这是在每种情况下发生的事情的权威参考。虽然阅读起来并不容易,但理解特定的角落案例以及它们为什么会这样做是很有用的。
在大多数情况下,严格模式只是限制了代码的功能,但不能假设删除严格模式永远不会改变行为。CCD_ 21阵列的使用例如在严格模式和正常模式中是不同的。
示例:
function test(a) {
"strict mode";
a = 42;
return arguments[0];
}
如果使用test (1337)
调用此函数,它将返回1337,但如果从中删除严格模式,它将改为返回42。
关于严格模式的作用的全面列表:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode
- 如何删除视频's缩略图时's加载在JW Player's闪光模式
- 在页面加载时删除CSS模式Flash
- 确认删除的模式对话框
- 从引导程序3删除模式向laravel控制器传递行id
- 显示模式时删除滚动条
- 引导程序 3 删除模式触发器
- 可以在没有副作用的情况下删除严格模式吗
- 查找模式并仅删除几个字符
- 如何在僵尸模式关闭后从按钮中删除焦点
- 如何从给定模式开始删除字符串的末尾
- 删除数组递归调用模式中的项
- 从引导模式窗口中删除模式属性
- 删除非限定标识符时出现严格模式语法错误背后的动机
- HTML 文档格式,根据模式删除
- 允许向对象添加和删除功能的设计模式
- 在iPhone的删除模式下应用程序抖动的算法
- 删除引导模式中的滚动条
- Twitter引导模式:如何删除向下滑动效果
- 只读模式下的 CKEditor 4 - 删除按钮会删除格式
- 如何使用下划线.js或 jquery 删除模式