这个运算符用于嵌套函数

时间:2014-11-28 13:28:06

标签: javascript

对不起,如果我的问题很愚蠢,我在google搜索,但我找不到任何有用的东西 这里我有模块,里面有2个函数,这里是代码

var sample = (function(){
    var _return = [];
    _return.bar = function(){
        alert("hello world");
    };
    _return.foo = function(){
        function test(){
           this.bar();
        };
    };
    return _return;
})();
sample.foo();

我的问题:
如何访问测试功能内的条形函数?我尝试了this.this.bar()parent.this.bar(),但没有一个有效 如何使用此运算符访问它?

3 个答案:

答案 0 :(得分:2)

通常(除非有人使用bind来更改函数的上下文),this上下文绑定到 on 上的对象,该函数被调用,即,如果您拨打foo.bar(),然后拨打barthis === foo。在您的情况下,由于您要返回_return,因此您希望访问在同一对象上定义的函数bar,即this.bar。但是,由于您将直接调用testthis将绑定到window对象。

解决此问题有三种主要方法:

尽可能保存上下文

_return.foo = function(){
    var self = this;
    function test(){
       self.bar();
    };
};

工作演示:http://jsfiddle.net/jcovmspr/

使用bind

另一种方法是使用bind(ES5):

_return.foo = function(){
    function test_(){
       this.bar();
    };

    var test = test_.bind(this);
};

使用箭头语法

第三种方法是使用arrow syntax来定义test,但这只是ES6,您需要transpiler来支持更常见的浏览器:

_return.foo = function(){
    var test = () => {
       this.bar();
    };
};

答案 1 :(得分:1)

您可以使用如下所示的闭包

注意:我更喜欢使用'that'或'me'而不是'self',因为self是JS中的特殊关键字。

_return.foo = function() {
    var that = this;

    function test(){
       that.bar();
    }
};

或者您可以使用bind

_return.foo = function() {
    var test = (function () {
       this.bar();
    }).bind(this);
};

答案 2 :(得分:1)

只需参考_return而不是this

var sample = (function(){
    var _return = {
        bar: function(){
            alert("hello world");
        },
        foo: function(){
            return function test(){
                _return.bar();
            };
        }
    };
    return _return;
})();
sample.foo()();

(另外,我使用了正确的对象文字,而不是在数组上创建属性)