JavaScript闭包和名称blobbering

时间:2012-03-08 16:11:55

标签: javascript namespaces scope closures

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

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

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

2 个答案:

答案 0 :(得分:12)

是的,他们有效地做到了。每个函数都创建一个新范围,并且声明请求变量的最近范围始终优先。没有例外。

答案 1 :(得分:1)

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

的情况
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
相关问题