this
在回调中主要有三种处理方式:
1.创建一个词法范围的变量,就像你目前所做的那样
这个新变量的两个最常见的名称是that
和self
。我个人更喜欢使用,that
因为浏览器有一个名为 self 的全局窗口属性,如果我隐藏它,我的 linter 会抱怨。
function edit(req, res) {
var that = this,
db.User.findById('ABCD', function(err, user){
that.foo(user);
});
};
这种方法的一个优点是,一旦将代码转换为 using,that
您就可以根据需要添加任意数量的内部回调,并且由于词法范围,它们都将无缝地工作。另一个优点是它非常简单,甚至可以在古老的浏览器上运行。
2. 使用 .bind() 方法。
Javascript 函数有一种.bind()
方法,可以让您创建具有固定this
.
function edit(req, res) {
db.User.findById('ABCD', (function(err, user){
this.foo(user);
}).bind(this));
};
在处理 时this
,bind 方法对于必须添加包装函数会更冗长的回调之一特别有用:
setTimeout(this.someMethod.bind(this), 500);
var that = this;
setTimeout(function(){ that.doSomething() }, 500);
的主要缺点bind
是,如果您有嵌套的回调,那么您还需要调用bind
它们。此外,IE <= 8 和其他一些旧的浏览器,不会在本地实现该bind
方法,因此如果您仍然需要支持它们,您可能需要使用某种填充库。
3. 如果您需要对函数作用域或参数进行更细粒度的控制,请回退到 .call() 和 .apply()
在 Javascript 中控制函数参数的更原始的方法,包括this
、.call()
和.apply()
方法。它们允许您使用任何对象this
作为其参数和任何值来调用函数。apply
对实现可变参数函数特别有用,因为它以数组的形式接收参数列表。
例如,这里有一个 bind 版本,它接收绑定为字符串的方法。这让我们this
只写一次而不是两次。
function myBind(obj, funcname){
return function(/**/){
return obj[funcname].apply(obj, arguments);
};
}
setTimeout(myBind(this, 'someMethod'), 500);