2

根据我的阅读和理解,函数的执行上下文(this)与其声明的位置无关,而与调用它的位置(调用站点)无关。考虑 2 种情况,其中 foo 在全局上下文中定义-

//1.
function foo(){ console.log(this); }

var obj = {
    x: foo,
};

obj.x(); //prints obj because foo was called "on" obj object

//2.
function foo(){ return this; }

var obj = {
    x: function(){ console.log(foo()); },
};

obj.x(); //prints window object.

我对第二种情况感到困惑。虽然我理解 x 函数的上下文是 obj,但我无法理解如何从 x 函数(其上下文实际上是 obj)对窗口对象调用 foo?我确信关于这个主题有很多问题,我找不到类似这种例子的东西。谢谢。

4

2 回答 2

0

我将尝试给出一个简短的答案:

函数的上下文通常是分配给它的对象。由于在第二种情况下 foo 未声明为对象的属性,因此它的上下文是全局(窗口)对象。

如果要将对象作为上下文传递给 foo ,则必须使用 foo.call(this, ...parameters) 或 foo.apply(this, parameters) 调用它,或者您可以创建一个函数绑定到的变量物体:

const myFoo = foo.bind(this);
myFoo(...parameters);

是一篇带有扩展解释的文章。

于 2018-10-13T10:01:23.810 回答
0

obj正如其他答案和评论所解释的:当 foo 被这样调用时,您的执行上下文不受约束。正如您所期望的那样,您可能想说:

foo.call(obj) 

基本上,您this在 foo 中绑定到作为obj第一个参数的对象。

MDN上的更多内容

于 2018-10-13T13:05:19.563 回答