JavaScript закрытия и дублирование имен - PullRequest
7 голосов
/ 08 марта 2012

Определены ли переменные внутри внутренней функции, которые имеют то же имя, что и переменная во внешней функции, изолированной от внешней переменной?

function() {
    var myTest = "hi there";
    ( function( myTest ) {
        myTest = "goodbye!";
    } )();
    console.log( myTest ); // myTest should still be "hi there" here, correct?
}

Естественно, если бы я не объявил myTest внутри внутренней функции, это создаст замыкание и изменит оригинал. Я просто хочу убедиться, что переменные, объявленные внутри внутренней функции, всегда изолированы от этой функции, даже если их имя может конфликтовать с внешней областью действия.

Ответы [ 2 ]

12 голосов
/ 08 марта 2012

Да, они действительно делают. Каждая функция создает новую область, и ближайшая область, в которой объявлена ​​запрошенная переменная, всегда имеет приоритет. Без исключений.

1 голос
/ 16 июня 2015

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

var x = 'a';
( function(  ) {   //note that there is no parameter here
    x = 'b';
    alert('inner:'+x); //b
} )();
alert('outer:'+x); //b

и вар с тем же именем

var x = 'a';
( function(  ) {
    var x = 'b';
    alert('inner:'+x); //b
} )();
alert('outer:'+x); //a
...