BrD*_*aHa 4 javascript node.js
要么我的 google-fu 失败了,要么没有人问过这个问题(值得怀疑),但是:为什么这没有抛出错误Invalid left-hand assignment?
\xe2\x9d\xaf node\nWelcome to Node.js v18.17.1.\nType ".help" for more information.\n> undefined = 'asdf'\n'asdf'\nRun Code Online (Sandbox Code Playgroud)\n
这是有历史原因的。null与and不同,trueand实际上不是关键字,而是没有值的全局变量。(在我看来这一直是个坏主意,但现在为时已晚。)falseundefined
如果启用严格模式,尝试更改此变量将失败,尽管错误会有所不同,抱怨它无法设置只读属性。
否则,它看起来会起作用,并且赋值本身将计算为新值(无论它实际执行什么操作,任何赋值总是如此),但全局变量undefined不会更改,因为它被设置为只读变量全局对象的唯一属性。
然而,没有人阻止你用这个名字声明一个新的局部变量(或类或函数)——尽管这是一件相当邪恶和令人困惑的事情,但我想你在递交辞职报告后可能会用它来惹恼你的同事。 ..?(不要这样做。)但这就是我们有 linter 的原因 - 任何合理的 linter 都不会让你使用这样的 footgun,即使语言本身允许。
这也是为什么您有时会看到如下所示的旧代码的原因:
(function (undefined) {
// ...
})();
Run Code Online (Sandbox Code Playgroud)
(有时会传递更多参数到IIFE,但最后一个参数会丢失。)这里的想法是undefined声明了指定的参数,但最后在函数调用中没有传递任何值,因此它的值将始终是未定义的。这可以防止其他代码undefined用其他代码覆盖全局。(也可以简单地放在var undefined;函数的开头,但如果无论如何都需要 IIFE 来进行作用域分离,那么这会更短且函数体内的“噪音”更小。)
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |