我有类似的设置:
this.engine = function()
{
// Select engine...
return justTheRightEngine;
}
// Later somewhere in the implementation...
this.engine().doSomeWork();
我很乐意在engine
之后删除括号,所以我尝试将其分配给自动调用函数:
this.engine = (function()
{
// Select engine...
return justTheRightEngine;
})();
// Later somewhere in the implementation...
this.engine.doSomeWork();
但是自动调用函数不会返回任何值(而是实际返回Window对象)。我可以在自动调用功能旁边使用任何语法/ hack吗?
答案 0 :(得分:1)
是的,这是可能的。在最近的浏览器中(FF> = 2.0,Chrome> = 1,IE> = 9,Opera> = 9.5,Safari> = 3),这将有效:
Object.defineProperty(this, 'engine', {get : function(){
//Select engine ...
return justTheRightEngine;
}});
我们正在添加 getter属性。
然后你可以这样称呼它:
this.engine.doSomeWork();
完全按照你的意愿。
答案 1 :(得分:0)
该函数的不同之处在于它不再被称为对象的方法,而是作为独立函数,因此this
将引用window
对象而不是对象。使用call
method将其称为对象的方法:
this.engine = (function()
{
// Select engine...
return justTheRightEngine;
}).call(this);
答案 2 :(得分:0)
只是为了完整,一个简单的
if (something_tells_me_this_engine_is_right())
this.engine = justTheRightEngine;
在大多数情况下,可能会成功,并且让人们坚持使用IE8 / XP来欣赏这个节目。
除非您在每次通话之前确实需要确保自上次调用引擎以来某人没有将您的FireFox隐蔽地转换为Opera浏览器。
(以狂躁的笑声退出场景)