如果您this
在不是构造函数的函数内部随机使用,那么您将得到几个不同的结果之一:
function callThis () { return this; }
callThis(); // returns window object
var Bob = { func : callThis };
Bob.func(); // returns Bob
callThis.call(Bob); // returns Bob
Call 是一种用于确定调用上下文的方法。
如果无法通过以下方式确定调用的上下文:
一个。“。”前面是什么。( Bob.func();
)
乙。明确传入的内容.call()
,.apply()
或.bind()
然后设置为window
。
这就是解决上下文的方式。
因此,如果您有一个特定的对象this
,那么您的解决方案如下:
function objMethod () {
var self = this;
function doStuff () {
self.otherFunc();
self.otherProperty = "bob";
}
doStuff();
}
var myObj = { myMethod : objMethod };
myObj.myMethod();
myObj
调用objMethod
上下文设置为myObj
. 将对当前上下文 ( )
objMethod
的引用保存为. 使用引用来修改被引用对象的属性。myObj
self
doStuff
function outer () {
function inner () { this.property = "Bob"; }
inner.call(this);
}
var obj = {};
outer.call(obj);
在这里,outer
传递了一个上下文,使用.call()
.
然后inner
通过this
of outer
,再次使用.call()
var bob = { name : "Bob" };
function sayName () { console.log(this.name); }
var bobFunc = sayName.bind(bob);
bobFunc();
在这里,我们使用.bind()
创建一个版本的 sayName ,其中this
始终设置为bob
。
您可以随意混合和匹配这些系统(在处理异步编程时,您可能会这样做)。