对不起,如果我的问题很愚蠢,我在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()
,但没有一个有效
如何使用此运算符访问它?
答案 0 :(得分:2)
通常(除非有人使用bind
来更改函数的上下文),this
上下文绑定到 on 上的对象,该函数被调用,即,如果您拨打foo.bar()
,然后拨打bar
,this === foo
。在您的情况下,由于您要返回_return
,因此您希望访问在同一对象上定义的函数bar
,即this.bar
。但是,由于您将直接调用test
,this
将绑定到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()();
(另外,我使用了正确的对象文字,而不是在数组上创建属性)