JavaScript"这个" .replace回调中的上下文

时间:2015-01-29 12:37:11

标签: javascript callback this

考虑以下非常简化的示例:

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()中的回调,我怎样才能使它工作?

2 个答案:

答案 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);
   });
}

Example - 1 Example - 2

答案 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)不起作用。