var test=(a=1,[b=2]["sort"])();
此代码在 Firefox 中有效,结果为 test=window(窗口对象),
它是有效的 JavaScript 代码吗? (我没能在 JavaScript 引用资料中找到它)
最佳答案
它是“有效的”,但在我看来完全是病态的。从 var
的名称来看,我猜想有人在某个时候想出了这个作为功能测试,但没有添加注释来解释原因。
这就是它正在做的事情。首先,这两个赋值将解析为赋值,所以我们可以替换它们(它们确实赋值变量,这是一个副作用,但这不影响这个表达式的评估):
var test=(1, [2]["sort"])();
["sort"] 就是 .sort:
var test=(1, [2].sort)();
逗号运算符将返回括号中的最后一个值,因此我们可以去掉 1:
var test=([2].sort)();
现在括号中的部分正在创建一个数组,其中包含数字 2,并找到该数组的 sort
方法。然后它调用该方法,但由于第一组括号,它在没有指定上下文的情况下调用它。
在非严格模式下,没有上下文调用的函数将 window
作为它的 this
。
因此它尝试对 window
进行排序并返回结果,如您所见,它是 window
。
在 Firebug 和 Chrome 中的 JS 控制台的严格模式下,没有上下文调用的函数将 undefined
作为它们的 this
,这意味着这个例子会抛出错误,如上面提到的 mplungjan。 https://developer.mozilla.org/en/JavaScript/Strict_mode
关于JavaScript。一个奇怪的赋值语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413071/