以下是代码和http://jsfiddle.net/h3cnn0xv/:
var test = function(){
return{
value: "hi",
func1: function(){
func2();
}()
};
}();
function func2(){
alert(test.value);
}
谁能告诉我,我做错了什么?我无法获得test.value。
答案 0 :(得分:1)
您的<item name="android:windowBackground">@null</item>
是从IIFE调用的,用于构建要分配给func2()
的对象的IIFE中的func1
属性。在它分配给test
之前。并且它尝试访问尚未test
的变量上的test.value
属性,并因此抛出undefined
。 (另见Self-references in object literal declarations)
我认为你在寻找
ReferenceError
答案 1 :(得分:0)
如果您运行此代码,您将获得undefined
。为什么?好吧,因为你没有给你的test
足够的时间来实际自我启动(以及你以同步方式做这件事的事实)。
试试这个异步解决方案。
var test = function(){
return{
value: "hi",
func1: function(){
setTimeout(function(){ func2(); }, 50);
//you can also just do
//setTimeout(func2, 50);
}()
};
}();
function func2(){
alert(test.value);
}
另请注意,您不会向func1返回任何内容,因为它会自动调用自身。如果你试图test.func1()
,它将无效。
答案 2 :(得分:0)
问题是您将对象文字指定给test
。但是,要构建该对象,请调用func2
。该函数试图访问test
,但此时它仍未定义。
因此,您应在将对象分配到func2
后调用test
:
var test = function(){
return {
value: "hi",
};
}();
test.func1 = function(){
func2();
}();
function func2(){
alert(test.value);
}
然而,请注意,这有点奇怪,因为匿名函数不会返回任何值。 func2(); test.func1 = undefined
会更自然。
答案 3 :(得分:0)
正如Bergi所说,你想使用Imidiatelly Invoked Function Expression (IIFE),但你的语法是错误的。
请参阅fixed fiddle
var test = (function(){
return{
value: "hi",
func1: function(){
func2();
}
};
})();
function func2(){
alert(test.value);
}
使用(在你的功能开始时和它结束之前你实际上立即调用它