var test=(a=1,[b=2]["sort"])();
此代码适用于Firefox生成的test = window(window object),
它是有效的JavaScript代码吗? (我在JavaScript参考资料中找不到它)
答案 0 :(得分:6)
这是“有效的”,但对我来说看起来完全是病态的。从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
答案 1 :(得分:0)
我希望代码能够出错。
逗号基本上评估左侧的表达式a=1
,然后评估右侧[b=2]["sort"]
的表达式,并返回右侧表达式的结果。
a=1
将a
设置为1,如果a
不在当前范围内,则创建[b=2]
。
b
将b
设置为2,如果[b=2]["sort"]
不在当前范围内,则创建.sort
,并创建值为2的单元素数组。
.sort
返回数组()
方法(它不会调用方法)。
因此,括号中表达式的结果是数组test
方法,然后由最终var test = ([2].sort)();
执行,结果将分配给{{1}},除非它没有'因为那时它实际上并没有在数组上调用。
最终作业相当于:{{1}}。