Javascript闭包意外结果

Javascript闭包意外结果,javascript,Javascript,关闭代码非常简短: var fn = function() { return function() { console.log(arguments); } } (function(arg) { console.log('bar'); })('foo'); 为什么打印的是[“foo”],而不是条?如果我注释掉var fn=…,结果与预期一致,并且打印出条。这两段代码如何关联?在变量定义后添加分号,如下所示: var fn = function() {

关闭代码非常简短:

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

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

为什么打印的是
[“foo”]
,而不是
?如果我注释掉
var fn=…
,结果与预期一致,并且打印出
条。这两段代码如何关联?

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

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

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

日志“bar”。

fn
}
后面没有分号,实际上是在调用带有参数
(函数…
)的
fn

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

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

(function (arg) {
    console.log('bar');
})('foo');
为什么打印
[“foo”]
而不是
'bar'
?这两段代码如何关联

用括号括住
(函数(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');

A阅读公认的答案:看看代码有多漂亮!我喜欢现在你有你的问题回答,考虑下面的难题:<代码> var = d*e新行(d+e).BLAH()换行符< /代码>(1)插入的分号在哪里?(2) 你能提供在这个片段之前运行的代码,让它做点什么吗?您的示例和本示例说明了为什么自动半插入最初是个坏主意。它将编译器立即检测到的一个小的、容易修复的编程错误转变为一系列陷阱,通过意外地改变程序的含义来困住粗心的程序员。这看起来几乎像是一种欺骗。这是你自己写的还是在什么地方找到的?这并不能真正回答“为什么”这个问题。一个简化的例子是
(function(){return function(){console.log(arguments);}}()('foo')
,它也会产生
foo
。是的,正如我所说,没有分号,尽管格式不明显,第二部分实际上与第一部分连接在一起。我同意你说的,我只是添加它作为参考。这不是一个答案,所以正确的答案是添加它的最佳位置。:-)是的,是的,当然,我只是想指出,在这种情况下,格式是所发生事情的罪魁祸首。他可能认为这两部分是不相关的,因为格式不同。实际上,他不是调用
fn
,而是将两次调用的结果赋给它(
未定义的
)。