根据我的阅读和理解,函数的执行上下文与该函数的声明位置无关,而与调用它的位置(调用站点)无关。考虑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/