考虑以下非常简化的示例:
var some_module = {
func_a: function() {
return 'a';
},
func_b: function(character) {
if (character == 'b') {
console.log(this); //refers to window
return this.func_a;
} else {
return 'X';
}
},
func_c: function() {
console.log(this); //refers to some_module
return "abcdefgh".replace(/[abc]/g, this.func_b);
}
};
some_module.func_c();
这失败了,因为在func_b中,"这个"由于调用上下文(据我所知),它指的是窗口。我知道解决方法,这通常在嵌套函数时起作用,但是在这种情况下,如何将函数用作.replace()中的回调,我怎样才能使它工作?
答案 0 :(得分:1)
尝试使用.bind
return "abcdefgh".replace(/[abc]/g, this.func_b.bind(this));
或存储对this
的引用,
func_c: function() {
var _this = this;
return "abcdefgh".replace(/[abc]/g, function (char) {
return _this.func_b(char);
});
}
答案 1 :(得分:0)
您可以使用ES7绑定操作符:
return "abcdefgh".replace(/[abc]/g, ::this.func_b);
请注意双冒号::
。如果给出正确的标志,Babel会支持这一点。见https://github.com/zenparsing/es-function-bind。另请参阅http://wiki.ecmascript.org/doku.php?id=strawman:bind_operator。
此增强功能的主要目的是阻止那些无法理解this
的人们在此处提出相同问题的流程,并想知道为什么setTimeout(this.foo, 1000)
不起作用。