Javascript模式表现得很奇怪

时间:2013-05-07 12:41:16

标签: javascript design-patterns

foo是一个调用自身的函数,在其中是一个函数bar,它也调用自身。然后我露出了bar。但为什么后来说'foo'是undefined

var foo = (function(){
    var bar = (function(t){
        console.log(t);
    })('test 1');

    return bar;
})();

console.log(foo); // output: undefined

更新

我想做这样的事情:

var foo = (function foo(){
    (function bar(t){
        console.log(t);
    })('test 1');

    return { bar : bar };
})();

foo.bar('test 2');

只是现在bar无法识别..似乎我不能自行执行一次,但将其作为返回值传递..

8 个答案:

答案 0 :(得分:2)

foo函数会立即调用自身,因此其返回值将分配给foo。它返回bar返回值,因为它也会立即调用自身,并且由于bar返回undefinedfoo会返回undefined }}:

// Outer function, immediately invoked
var foo = (function(){

    // Inner function, immediately invoked
    var bar = (function(t){
        console.log(t);
        // Implicitly return undefined
    })('test 1');

    // bar is now === undefined

    return bar;
})();

console.log(foo); // output: undefined

答案 1 :(得分:2)

  

foo是一个自称为

的函数

没有。 foo是立即调用匿名函数的返回值

  

但为什么后来说'foo'是undefined

该函数返回bar,这是对另一个匿名函数的另一个立即调用的返回值。

该函数的返回值是,因为其中没有return语句:undefined(所以barundefined所以foo是{ {1}}。

答案 2 :(得分:1)

根本没有表现得很奇怪。

   var bar = (function(t){
        console.log(t);
        // return undefined;
    })('test 1');
   return bar; // again return undefined;

它没有return语句,因此返回undefined。然后,您再次返回undefined,因此很明显foo也将undefined

答案 3 :(得分:1)

foo不是函数,而是匿名函数的返回

function(){
    var bar = (function(t){
        console.log(t);
    })('test 1');

    return bar;
}

返回的是bar,即匿名函数的返回

function(t){
    console.log(t);
}

t == 'test 1'。此函数不返回任何内容,因此bar未定义,以及foo

答案 4 :(得分:0)

我读到这个的方式:你没有回酒吧,你正在返回bar的结果('test 1');这是未定义的。

答案 5 :(得分:0)

你的函数周围有额外的括号。这将它变成一个自动调用的匿名函数。

这意味着foo设置为其返回值!

您需要做的就是删除额外的括号。

http://jsfiddle.net/Xfh58/

答案 6 :(得分:0)

bar不会返回值,因此foo也不会。

答案 7 :(得分:0)

因为条形函数没有返回任何内容。在javascript中没有返回值的函数返回undefined。

如果您将栏更改为:

var bar = (function(t){
    return t;
})('test 1');

你的foo将不再是未定义的。