【问题标题】:JavaScript closures and name clobberingJavaScript 闭包和名称破坏
【发布时间】:2012-03-26 03:02:22
【问题描述】:

内部函数中定义的变量是否与外部函数中的变量同名,与外部变量隔离?

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

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

【问题讨论】:

    标签: javascript namespaces scope closures


    【解决方案1】:

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

    【讨论】:

    • @chaiguy:是的,对不起。把我的话弄混了。
    • 这个方法也避免了范围查找。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      相关资源
      最近更新 更多