0

foo是一个调用自身的函数,并且在bar其中也有一个调用自身的函数。那我就暴露了bar。但为什么它后来说 '​​foo' is 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无法识别..似乎我不能自我执行一次,但将其作为返回值传递..

4

8 回答 8

2

foo函数立即调用自身,因此将其返回值分配给foo. 它返回 的返回值bar因为它也立即调用自身,并且由于bar返回undefined,也foo返回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
于 2013-05-07T12:42:46.393 回答
2

foo是一个调用自身的函数

No.foo是立即调用匿名函数的返回值。

但为什么它后来说 '​​foo' is undefined

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

该函数的返回值是,因为其中没有return语句:(undefined所以baris undefinedso foois undefined.

于 2013-05-07T12:43:30.373 回答
1

它的行为一点也不奇怪。

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

它没有return声明,因此它正在返回undefined。然后你又回来undefined了,所以很明显foo也会undefined

于 2013-05-07T12:43:16.200 回答
1

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

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

    return bar;
}

而return就是bar,也就是匿名函数的return

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

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

于 2013-05-07T12:44:56.693 回答
0

我读这个的方式:你不是在返回 bar,你是在返回 bar('test 1'); 的结果。这是未定义的。

于 2013-05-07T12:43:20.360 回答
0

您的函数周围有额外的括号。这将其变成了一个自调用匿名函数。

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

您需要做的就是删除多余的括号。

http://jsfiddle.net/Xfh58/

于 2013-05-07T12:43:53.200 回答
0

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

于 2013-05-07T12:45:22.877 回答
0

t因为 bar 函数不返回任何内容。javascript 中没有返回值的函数返回未定义。

如果您将 bar 更改为此:

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

你 foo 将不再是未定义的。

于 2013-05-07T12:45:33.707 回答