JavaScript的。一个奇怪的作业句子

时间:2011-12-07 09:32:59

标签: javascript arrays

var test=(a=1,[b=2]["sort"])();

此代码适用于Firefox生成的test = window(window object),

它是有效的JavaScript代码吗? (我在JavaScript参考资料中找不到它)

2 个答案:

答案 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=1a设置为1,如果a不在当前范围内,则创建[b=2]

bb设置为2,如果[b=2]["sort"]不在当前范围内,则创建.sort,并创建值为2的单元素数组。

.sort返回数组()方法(它不会调用方法)。

因此,括号中表达式的结果是数组test方法,然后由最终var test = ([2].sort)();执行,结果将分配给{{1}},除非它没有'因为那时它实际上并没有在数组上调用。

最终作业相当于:{{1}}。