Подтвердить что ты не робот

Закрытие Javascript неожиданным результатом

Код замыкания очень короткий:

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

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

Почему вместо bar печатается ["foo"]? Если я прокомментирую var fn = ..., результат будет таким, как ожидалось, и bar будет напечатан. Как эти 2 части кода могут быть связаны?

4b9b3361

Ответ 1

Без точки с запятой после } fn вы на самом деле вызываете fn с аргументом (function...).

Если вы добавите недостающую точку с запятой, она будет работать так, как вы ожидаете:

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

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

Ответ 2

Почему вместо 'bar' печатается ["foo"]? Как эти 2 части кода могут быть связаны?

В скобках вокруг (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');

Ответ 3

добавление точки с запятой после определения переменной следующим образом:

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

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

logs bar.