JavaScript.一个奇怪的分配句子

JavaScript. An Odd Assignment Sentence

本文关键字:分配 句子 一个 JavaScript      更新时间:2023-09-26
var test=(a=1,[b=2]["sort"])();

这段代码在火狐中工作 结果 test=窗口 (窗口对象(,

它是有效的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

我希望该代码会给出错误。

逗号基本上计算左边的表达式,a=1然后计算右边的表达式[b=2]["sort"],并返回右边表达式的结果。

a=1a设置为 1,如果a不在当前范围内,则将其创建为全局。

[b=2]b 设置为 2,如果b不在当前范围内,则将其创建为全局数组,并创建值为 2 的单元素数组。

[b=2]["sort"]返回数组.sort方法(它不调用该方法(。

所以括号中的表达式的结果是数组.sort方法,然后由最终()执行,结果将被分配给test,除了它不起作用,因为那时它实际上并没有在数组上调用。

最终作业相当于:var test = ([2].sort)(); .