功能范围和 javascript 中的 "this"
functional scope and "this" in javascript
我有一段简单的代码(其中 ko == knockout lib):
$(function() {
//var el = document.getElementById('foo');
//console.log(el);
$("#foo").click (function() {console.log(this);});
}); // this == $("#foo")
ko.computed(function () {
console.log('ko computed',this); // this == window object
});
});
为什么回调中"this"没有绑定到"ko"?我希望它绑定到调用函数,就像在点击处理程序中一样。
computed
的第二个参数是上下文,例如
ko.computed(function () {
console.log('ko computed',this);
}, this);
或者您可以显式绑定到 ko
。
ko.computed(function () {
console.log('ko computed',this);
}, ko);
http://knockoutjs.com/documentation/computedObservables.html
如果您查看此方法的 knockout.js sourcecode,我们会发现这一行:
return state.evaluatorFunctionTarget ? readFunction.call(state.evaluatorFunctionTarget) : readFunction();
如果没有提供 evaluatorFunctionTarget(ko.computed
中的第二个参数),回调将在没有上下文的情况下被调用,this
将是默认的 window
上下文。
如果您传递了第二个参数,回调将被调用,this
是您传递的任何内容。
除非函数作为另一个对象 (someobject.someMethod()
) 的 属性 调用,使用 .call()
或 .apply()
调用,或者具有绑定到它的上下文使用 .bind()
,则 this
将始终是 window
对象。
我有一段简单的代码(其中 ko == knockout lib):
$(function() {
//var el = document.getElementById('foo');
//console.log(el);
$("#foo").click (function() {console.log(this);});
}); // this == $("#foo")
ko.computed(function () {
console.log('ko computed',this); // this == window object
});
});
为什么回调中"this"没有绑定到"ko"?我希望它绑定到调用函数,就像在点击处理程序中一样。
computed
的第二个参数是上下文,例如
ko.computed(function () {
console.log('ko computed',this);
}, this);
或者您可以显式绑定到 ko
。
ko.computed(function () {
console.log('ko computed',this);
}, ko);
http://knockoutjs.com/documentation/computedObservables.html
如果您查看此方法的 knockout.js sourcecode,我们会发现这一行:
return state.evaluatorFunctionTarget ? readFunction.call(state.evaluatorFunctionTarget) : readFunction();
如果没有提供 evaluatorFunctionTarget(ko.computed
中的第二个参数),回调将在没有上下文的情况下被调用,this
将是默认的 window
上下文。
如果您传递了第二个参数,回调将被调用,this
是您传递的任何内容。
除非函数作为另一个对象 (someobject.someMethod()
) 的 属性 调用,使用 .call()
或 .apply()
调用,或者具有绑定到它的上下文使用 .bind()
,则 this
将始终是 window
对象。