Javascript 此运算符用于嵌套函数

Javascript 此运算符用于嵌套函数,javascript,Javascript,对不起,如果我的问题很傻,我在谷歌上搜索了一下,但找不到任何有用的东西。 这里我有一个模块,里面有两个函数,下面是代码 var sample = (function(){ var _return = []; _return.bar = function(){ alert("hello world"); }; _return.foo = function(){ function test(){ this.bar(

对不起,如果我的问题很傻,我在
谷歌上搜索了一下,但找不到任何有用的东西。
这里我有一个模块,里面有两个函数,下面是代码

var sample = (function(){
    var _return = [];
    _return.bar = function(){
        alert("hello world");
    };
    _return.foo = function(){
        function test(){
           this.bar();
        };
    };
    return _return;
})();
sample.foo();
还有我的问题:
如何访问测试函数中的bar函数?我尝试了
this.this.bar()
parent.this.bar()
,但都没有成功。
使用此运算符如何访问它?

通常(除非使用了
bind
来更改函数的上下文),
上下文绑定到调用函数的对象,即,如果调用
foo.bar()
,则在
bar
内部,
this==foo
。在您的情况下,由于您正在返回
\u return
,因此您希望访问在同一对象上定义的函数
bar
,即
this.bar
。但是,由于您将直接调用
test
将绑定到
窗口
对象

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

尽可能保存上下文 工作演示:

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

使用箭头语法 第三种方法用于定义
test
,但这仅限于ES6,您需要一种支持更常见浏览器的方法:

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

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

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

或者您可以使用
bind

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

只需参考
\u return
,而不是

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

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

哦,天哪,我怎么会错过这个解决方案呢?是的,你的答案非常符合逻辑。你真的应该使用
var\u return={}
。谢谢你的回答。你能解释一下你的第二个解决方案吗?我找不到它???@Daniel.V
bind
允许你返回一个函数的副本,但是它的
这个
关键字总是指向提供的对象,作为
bind
的第一个参数。然而,
bind
比这更强大,允许执行部分函数应用程序。也许他想要一个数组,但是。。。没办法说;)@Bergi我更喜欢使用数组而不是对象,因为我不想在我的模块中使用_return,事实上我认为数组方法更有效structural@Daniel.V:但这不是对象和数组之间的区别。如果要用项目填充数组,则只能使用其
.length
等。
_return.foo = function() {
    var that = this;

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