如何从匿名函数中获取值?

时间:2015-04-22 13:44:49

标签: javascript

以下是代码和http://jsfiddle.net/h3cnn0xv/

var test = function(){
    return{
        value: "hi",
        func1: function(){
            func2();
        }()
    };
}();

function func2(){
    alert(test.value);
}

谁能告诉我,我做错了什么?我无法获得test.value。

4 个答案:

答案 0 :(得分:1)

您的<item name="android:windowBackground">@null</item> 是从IIFE调用的,用于构建要分配给func2()的对象的IIFE中的func1属性。在它分配给test之前。并且它尝试访问尚未test的变量上的test.value属性,并因此抛出undefined。 (另见Self-references in object literal declarations

我认为你在寻找

ReferenceError

updated fiddle

答案 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);
}

Demo

另请注意,您不会向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);
}

使用(在你的功能开始时和它结束之前你实际上立即调用它