gpt4 book ai didi

javascript - 使用 Javascript 变量赋值上下文中的表达式和上下文之外的表达式有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:18:17 24 4
gpt4 key购买 nike

剧透

我正在尝试 solve problem #8这个 Javascript 注入(inject)游戏。

Erling Ellingsen 的评论之一中,我发现了这个有趣的片段。

(_=[].concat)()[0]

上面的代码片段和这个有什么区别

([].concat)()[0]

当您将 [].concat 分配给变量时会发生什么变化?很明显,他只是试图访问全局窗口对象,但这两个评估有何不同?

最佳答案

这个以前 起作用的原因是因为在以前版本的 ECMAScript 中指定 this 值将是全局对象(即 window)。然而,从 ECMAScript 5 开始,this 值现在是 undefined,这使得 Array.prototype.concat 抛出错误。

在 ES3 中,如果使用 undefinednullthis 值调用 native 函数(例如当您调用它时使用 func()),它将为函数提供全局对象。

在 ES5 中, native 函数的行为已更改,因此即使您的代码未处于严格模式,它也会获得实际的 undefinednull 值。


两者的区别在于,一个是函数的值,因此被间接调用,而另一个是对函数的引用。

GetValue() 是一个内部函数,它从变量中获取引用的值 - 在“直接”调用时不会调用此函数,但会在分配给另一个变量并使用该变量的结果时调用, 它确实被称为 ( source )。

两者区别的一个臭名昭著的例子是使用 eval() 时:

var a = 0;
function test()
{ var a = 1, b;
console.log(eval("a")); // 1
console.log((b=eval)("a")); // 0
}
test();

不过在您的示例中,它的工作方式如下:

var a = [].concat;
// called as variable, not property
a(); // therefore it's global

// same as the following, as all these expressions call GetValue() interally
(0, [].concat)();
(random = [].concat)();
([].concat || 0)();

// but this doesn't work
[].concat(); // `this` is the new array, not global object

关于javascript - 使用 Javascript 变量赋值上下文中的表达式和上下文之外的表达式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19264002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com