除了这里给出的其他答案之外,如果您没有支持 ES5 的浏览器,您可以使用如下代码非常简单地创建自己的“永久绑定函数”:
function boundFn(thisobj, fn) {
return function() {
fn.apply(thisobj, arguments);
};
}
然后像这样使用它:
var Example = (function() {
function Example() {
var privateFunction = boundFn(this, function() {
// "this" inside here is the same "this" that was passed to boundFn.
console.log(this);
});
this.publicFunction = function() {
privateFunction();
}
}
return Example;
}()); // I prefer this order of parentheses
瞧——this
神奇地是外部上下文this
而不是内部上下文!
如果您的浏览器中缺少类似 ES5 的功能,您甚至可以获得类似 ES5 的功能(如果您已经拥有它,这将不起作用):
if (!Function.prototype.bind) {
Function.prototype.bind = function (thisobj) {
var that = this;
return function() {
that.apply(thisobj, arguments);
};
}:
}
然后使用var yourFunction = function() {}.bind(thisobj);
完全相同的方式。
完全兼容(尽可能)、检查参数类型等的类 ES5 代码可以在mozilla Function.prototype.bind中找到。如果您正在使用功能做一些不同的高级事情,那么有些差异可能会让您感到困惑,因此如果您想走这条路,请在链接上阅读。