根据我的阅读和理解,函数的执行上下文与该函数的声明位置无关,而与调用它的位置(调用站点)无关。考虑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?
确保有关此主题的问题很多,但我找不到类似的例子。谢谢。

最佳答案

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

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

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

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


Here是具有扩展说明的文章。

关于javascript - 从另一个对象中调用时,这是javascript函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52791020/

10-12 00:17
查看更多