2013-12-17 2 views
-1

Является ли это:Являются ли эти две функции, выполняющие анонимные Javascript, эквивалентными?

(function(a) { 
    return 3; 
})(this); 

эквивалентно:

(function() { 
    return 3; 
})(); 

Если есть какие-либо различия, пожалуйста, объясните

+5

Они равны, так как вы не делаете ничего с этим параметром. – DontVoteMeDown

+0

@DontVoteMeDown: Параметры в Javascript необязательны? Потому что, если они не находятся, эти две функции * не * эквивалентны. –

+0

@RobertHarvey. Они могут передавать любое количество параметров в функцию, даже если они не определены, к ним можно получить доступ через массив аргументов. Любые параметры без доступа просто не определены. –

ответ

2

Вот что я думаю, что вы ищете: второй пример имеет доступ к внешнему 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 
})(); 
+0

Благодарим вас за то, что вы представляете мне концепцию затенения. Я не знал об этом, поэтому мне трудно было рассказать вопрос, спасибо! – user2202911

0

Ну, первый вы передаете аргумент, но это никогда не используется. Однако функциональность одинакова для обоих. Второе немного быстрее, из-за отсутствия аргумента без причины, предполагая, что это не просто оптимизировано.

+2

У вас есть эталон, чтобы доказать, что он быстрее? Похоже, что это зависит от оптимизации парсера. –

+0

@MichaelBerkowski, вы делаете хороший момент. Reeworded –

0

Это зависит от того, как вы определяете эквивалент.

Если вы определяете его с точки зрения того, что на самом деле функции делают, то да, они эквивалентны. Хотя, конечно, это верно только для их текущего содержания. Одно из отличий заключается в том, что первый имеет доступ к внешнему this, а второй - нет - хотя это не имеет значения в вашем примере.

Относительно вашего комментария, только минуя this имеет значение здесь: Нет, это не так.

Если определить эквивалентный по-другому, то функции могут быть различными, например, при определении эквивалент как имеющий такую ​​же значимость.

Я предполагаю, что очевидным встречным вопросом будет то, что используется для вашего вопроса: Почему вы спрашиваете? (Если это не просто из любопытства и по академическим причинам.)

+0

Я пытаюсь понять, если «эта» переменная имеет какое-то значение за кулисами. – user2202911

+0

Нет, это не так (см. Мой обновленный ответ). –

+0

Я не понимаю, какова цель «этого», я видел библиотеку JavaScript с открытым исходным кодом, используя этот стиль, и я пытаюсь понять это. Я сделаю еще несколько исследований и вернусь к более определенному вопросу. – user2202911

Смежные вопросы