关于电话:
您可以通过使用.call()
which来解决这个问题:
- 必须在函数上调用
addName.call()
- 你传递给它一个你想成为“这个”的对象
addName.call({"name" : 'angela'});
- 您可以传递可以在调用它的函数中使用的其他参数,
addName.call({"name": "angela"}, true);
其中可能addName
接受 boolean 参数append
。
使用调用:
对于这个特殊问题,我们可以通过“父”对象call
来覆盖this
子对象中通常存在的内容。
先看看我们的问题
var app = {
init: function() {
var _this = this; // so we can access the app object in other functions
$('#thingy').click(function(){
alert(_this.options.thingy());
});
$('#another').click(function(){
alert(_this.options.getAnother());
});
},
options: {
thingy: function() {
// PROBLEM: the this here refers to options
return this.getThingy();
},
getAnother: function() {
// PROBLEM 2: we want the this here to refer to options,
// but thingy will need the parent object
return 'another ' + this.thingy();
},
},
getThingy: function() {
return 'thingy';
}
};
现在,这是一个解决方案 use call
和JSFIDDLE看看它的工作原理。
var app = {
init: function() {
var _this = this; // so we can access the app object in other functions
$('#thingy').click(function(){
// SOLUTION: use call to pass _this as the 'this' used by thingy
alert(_this.options.thingy.call(_this));
});
$('#another').click(function(){
// SOLUTION 2: Use call to pass parent all the way through
alert(_this.options.getAnother.call(_this));
});
},
options: {
thingy: function() {
// SOLUTION in action, the this is the app object, not options.
return this.getThingy();
},
getAnother: function() {
// SOLUTION 2 in action, we can still access the options
// AND pass through the app object to the thingy method.
return 'another ' + this.options.thingy.call(this);
},
},
getThingy: function() {
return 'thingy';
}
};
综上所述
.call()
每当您在主对象的属性上使用方法时,您都可以使用:app.options.someFunction(arg)
应始终使用.call
-调用app.options.someFunction.call(this, arg);
- 这样您就可以确保您始终可以访问对象的每个部分。它可以让您访问另一个属性的方法,例如app.helpers.anotherFunction()
.
一个好主意是在somefunction
, 存储this
在一个变量中,_parentThis
因此很明显this
反映了什么。