Вот что я думаю, что вы ищете: второй пример имеет доступ к внешнему this
(через переменную a
), а второй пример не.
Как правило, вам не нужно передать в качестве аргументов к IIFE (хотя вы, конечно, может, чтобы получить более читаемый или модульный код), так как недавно объявленные функции имеют доступ к своей внешней переменной области видимости:
var foobar = 5;
(function() {
// I can use the outer-scope `foobar` in here!
})();
Однако this
исключительный случай, так как недавно созданная функция будет иметь свой собственный this
что будет затенять внешнее this
:
// outer here, `this` is one thing
(function() {
// in here, `this` might be something else
// because each new functions invocation sets `this` within the function
})();
Вы можете увидеть теневое поведение с не- this
переменных, как это:
var foobar = 5;
(function() {
var foobar = 7;
// I can't use the outer-scope `foobar`
// because it is shadowed by local-scope `foobar`
})();
Подобное происходит с this
. В моем примере foobar
затенение выполнялось явно, но с this
, тень всегда происходит, потому что каждая функция получает новую локальную область this
.
Вы можете получить доступ к внешней this
альясингом ему новое имя, сделано здесь формальный аргумент:
// outer here, `this` is one thing
(function(outerThis) {
// in here, `this` might be something else
// but `outerThis` refers to the outer `this`
})(this);
Если вы не псевдоним внешнего this
новое имя, вы не будете иметь доступ к это, потому что оно будет затенено местным this
. Обратите внимание, что вы можете также псевдоним ваш внешний this
другой переменной внешнего области действия, как:
var outerThis = this;
(function() {
// we can access the outer-scope `outerThis` because it is not shadowed
})();
Они равны, так как вы не делаете ничего с этим параметром. – DontVoteMeDown
@DontVoteMeDown: Параметры в Javascript необязательны? Потому что, если они не находятся, эти две функции * не * эквивалентны. –
@RobertHarvey. Они могут передавать любое количество параметров в функцию, даже если они не определены, к ним можно получить доступ через массив аргументов. Любые параметры без доступа просто не определены. –