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.Vbind
允许你返回一个函数的副本,但是它的这个关键字总是指向提供的对象,作为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()();