Javascript关闭意外结果

时间:2014-04-09 10:38:10

标签: javascript

关闭代码很短:

var fn = function() {
    return function() {
        console.log(arguments);
    }
}

(function(arg) {
    console.log('bar');
})('foo');

为什么要打印["foo"]而不是bar?如果我发表评论var fn = ...,则结果符合预期,并打印bar。这两段代码如何相关?

3 个答案:

答案 0 :(得分:31)

}的{​​{1}}之后没有分号,您实际上是使用参数fn调用fn

如果添加缺少的分号,它会按预期工作:

(function...)

答案 1 :(得分:4)

  

为什么要打印["foo"]而不是'bar'?这两段代码如何相关?

使用(function(arg) {…})周围的括号,它被视为函数表达式的参数,就像您期望('foo')成为IEFE的参数一样。实际上,foo现在传递给作为第一次调用结果的函数:

var fn = (
        (function() {
            return function() {
                console.log(arguments);
            };
        })
        (function(arg) {
            console.log('bar');
        })
    )
    ('foo');

要解决此问题,请在分配后始终使用分号,或使用函数声明:

function fn() {
    return function() {
        console.log(arguments);
    }
}
(function(arg) {
    console.log('bar');
})('foo');

答案 2 :(得分:3)

在变量定义之后添加分号,如下所示:

var fn = function() {
    return function() {
        console.log(arguments);
    }
};

(function(arg) {
    console.log('bar');
})('foo');

日志' bar'。