使用var that = this
进行回调时,为什么回调函数必须是function() {that.myFn()}
而不是that.myFn
?
例如:
var obj = {
foo: function(fn) {
console.log('--foo--', this);
fn();
},
bar: function() {
console.log('--bar--', this);
},
render: function() {
var that = this;
// this line works
this.foo( function() {that.bar()} );
// this line doesn't work
this.foo(that.bar);
}
}
obj.render()
答案 0 :(得分:2)
原因是因为CreditCard
与bar.call(that)
相同,但CreditCard
与that.bar()
相同,而in loose mode, undefined
becomes the global context则是fn()
{1}}。
答案 1 :(得分:2)
在
等属性上调用函数时myObject.myFunction();
它会自动将this
值绑定到该对象,而只需获取对该函数对象的引用,如下所示:
var x = myObject.myFunction;
x();
并不意味着任何“这个”。第一个语句只是将x设置为与myObject的该属性引用的函数相同的函数。
将其包装在类似的函数中:
var x = function(){ myObject.myFunction()};
x();
调用myFunction,myObject绑定到“this”。
您也可以使用javascript Function.prototype函数“call”,“apply”和“bind”,如下所示:
var x = myObject.myFunction.bind(myObject, parameterOneIfAny);
x();
返回一个具有显式绑定“this”值“myObject”的函数。它只是javascript函数系统的一部分,在你没有设置this
的情况下,函数对象不会将“this”上下文(或者默认this
保存到环境“global”对象中)除非使用属性语法object.function()
调用或使用object.function.bind(object)
最后,如果您使用{/ 1}}调用任何函数引用,如
new
var x = myObject.myFunction.bind(myObject, parameterOneIfAny);
var y = new x();
被实例化为一个新对象,并作为返回值传递,这是javascript的假“类”语法的基础。所以在这种情况下,x被作为构造函数调用,并返回其this
值,使y为'new'x。
最后,如果您尝试在未使用this
上下文调用的函数中使用this
,则javascript strict模式将调用您,而不是默认的非严格行为{{ 1}}到this
对象。
答案 2 :(得分:-1)
正如@slackOverflow所说。这里有一个有助于理解的链接 https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/this
或试试这个。这个帖子很有帮助。 http://ryanmorr.com/understanding-scope-and-context-in-javascript