所有
我有一些基本上是
的代码function b(){
console.log(this);
}
function a(){
console.log(this);
b();
}
Window.call(context, a);
输出如下:
Object(context)
Window
看起来非标准上下文仅在调用call时保留,所有未指定上下文的子例程都使用原始上下文调用。有没有办法用上下文调用函数,让整个执行堆栈占用相同的上下文?
谢谢,
答案 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
值执行。