如果您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的引用保存为. 使用引用来修改被引用对象的属性。myObjselfdoStuff
function outer () {
function inner () { this.property = "Bob"; }
inner.call(this);
}
var obj = {};
outer.call(obj);
在这里,outer传递了一个上下文,使用.call().
然后inner通过thisof outer,再次使用.call()
var bob = { name : "Bob" };
function sayName () { console.log(this.name); }
var bobFunc = sayName.bind(bob);
bobFunc();
在这里,我们使用.bind()创建一个版本的 sayName ,其中this始终设置为bob。
您可以随意混合和匹配这些系统(在处理异步编程时,您可能会这样做)。