从内部/私人功能调用公共功能?
问题描述:
只是想知道如果我失去了一些东西或没有,但我试图做到以下几点:从内部/私人功能调用公共功能?
(function() {
var thing = function() {
var doIt = function() {
console.log("just do it");
this.updateValue(5);
};
return {
updateValue: function(val) {
console.log('updating value: ' + val);
},
go: function() {
doIt();
}
}
};
var t = thing();
t.go();
}())
这将导致“只管去做”显示在控制台紧随其后的错误了B/C,它说“ updateValue“不是一个函数。我想知道,一个内部/私有函数(例如“doIt”)可以调用一个公共函数(例如“updateValue”)吗?也许这只是糟糕的设计,你永远不应该真的想这样做,我实际上已经重构了我的代码,以避免/不这样做,但我很好奇,如果这是可能的。
在此先感谢。
答
无论是使用呼叫/适用于明确指定this
上下文(如@SLaks和@Alnitak)提到或者在一开始定义函数,然后将其添加为属性返回的对象:
var thing = function() {
var updateValue = function() { /* */ },
doIt = function() {
console.log("just do it");
updateValue(5);
};
return {
updateValue: updateValue, // minor duplication here
go: function() {
doIt();
}
};
};
如果未成年人重复惹恼了你,你也可以这样做:
var thing = function() {
var exposed = {
updateValue: function(val) {
console.log('updating value: ' + val);
},
go: function() {
doIt();
}
}, doIt = function() {
console.log("just do it");
exposed.updateValue(5);
};
return exposed;
};
答
写入doIt()
,调用全局上下文中的函数,所以this
是window
对象。
您需要编写doIt.call(this)
以传递您的this
作为doIt
的上下文。
+0
嘎,你补充说,虽然我正在写我的答案:) – Alnitak 2011-05-06 12:17:48
答
每个@SLaks答案,this
在由doIt()
调用时不正确。
相反,尝试:
doIt.call(this);
感谢大家谁在那里的答案。 @SLaks和@Alnitak我明白你的意思了,谢谢指出。 @ andreas-grech - 我选择了你的回答作为“答案”b/c我喜欢“暴露”的想法,我只是将其命名为“api”:) – codecraig 2011-05-06 13:11:09
我通常尽量避免使用“this”因为如果你对它不是很小心的话,它会咬你。 如果您想了解更多信息,请阅读以下内容:http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/ – 2011-05-06 14:09:29