JavaScript闭包和名称闭包

JavaScript闭包和名称闭包,javascript,namespaces,scope,closures,Javascript,Namespaces,Scope,Closures,内部函数中定义的变量与外部函数中的变量具有相同的名称,是否与外部变量隔离 function() { var myTest = "hi there"; ( function( myTest ) { myTest = "goodbye!"; } )(); console.log( myTest ); // myTest should still be "hi there" here, correct? } 很自然,如果我没有在内部函数中声明myTes

内部函数中定义的变量与外部函数中的变量具有相同的名称,是否与外部变量隔离

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

很自然,如果我没有在内部函数中声明
myTest
,它将创建一个闭包并修改原始函数。我只是想确保在内部函数中声明的变量始终与该函数隔离,即使它们的名称可能与外部作用域冲突。

是的,它们实际上是隔离的。每个函数都创建一个新的作用域,并且声明所请求变量的最近的作用域始终优先。没有例外。

只是为了完整起见。在这些非常相似的例子中,这里是没有参数的情况

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

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

@柴伊:是的,对不起。我的话有点混淆了。这个方法也避免了范围查找。