JS Call Stack with context

时间:2014-11-02 15:44:19

标签: javascript

所有

我有一些基本上是

的代码
function b(){
    console.log(this);
}

function a(){
    console.log(this);
    b();
}

Window.call(context, a);

输出如下:

Object(context)
Window

看起来非标准上下文仅在调用call时保留,所有未指定上下文的子例程都使用原始上下文调用。有没有办法用上下文调用函数,让整个执行堆栈占用相同的上下文?

谢谢,

2 个答案:

答案 0 :(得分:3)

您必须使用.call().apply()

function a(){
    console.log(this);
    b.call(this);
}

您无法将运行时转换为隐式执行此操作的模式,因此对您的问题的直接回答是“否”。

如果您有许多功能,并且想要创建始终具有this特定值的版本,则可以使用.bind()

function b(){
    console.log(this);
}

function a(){
    console.log(this);
    b();
}

a = a.bind(context), b = b.bind(context);
a(); // logs context from both functions

这是一件非常不寻常的事情,但它会起作用。如果你想使用不同对象的函数,那你就不走运了。

答案 1 :(得分:1)

Javascript中有一条简单的规则。 Javascript中的每个函数调用都为this设置了一个新值。如果您未进行方法调用,例如obj.method()或使用.call().apply(),则this会重新设置为全局对象或undefined严格模式。

因此,如果您希望在任一函数调用中专门控制this的值,则需要使用.call().apply()或甚至.bind() }。当你调用其他函数时,没有魔术模式可以将Javascript放入“保留”this。它只是不起作用。

从架构上讲,如果你真的想要几个函数的this的特定值,那么它们应该是公共对象上的方法,因为调用obj.method()会自动将this设置为{{ 1}}或者您可以使用obj.call()手动指定您希望.apply()值用于任何函数调用。

在您的代码示例中,您可以更改:

this

到此:

function a(){
    console.log(this);
    b();
}

并且function a(){ console.log(this); b.call(this); } 将使用与b()相同的this值执行。