功能范围和 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 对象。