【问题标题】:Is it possible to access a function local variable from outside of the function?是否可以从函数外部访问函数局部变量?
【发布时间】:2012-03-29 03:22:14
【问题描述】:

我今天听说“可以访问函数的局部变量,因为 javascript 中的所有内容都是全局的”。

据我所知,您无法从变量范围之外访问局部变量。

例如,

function f()
{
    var myvar = "something";
}

myvar = "c"; // i'm not accessing myvar in f();

我还听说可以使用 for(var i in window) 来访问 myvar。我想确认这是不可能的,因为我不是该语言的作者。

更新:

我问了他一个代码 sn-p,这是我收到的。

var person = {
    whoIs : function()
    {
        var name = "name";
        return name;
    }
};


var str = "TEST:\n";

for(var n in person)
{
    str += n;
    str += " = [" + person[n] + "]\n";
}

// perform regular exp. to get the value of name variable.


alert(str);

它没有访问变量............它只是打印函数的样子......

【问题讨论】:

  • “可以访问函数的局部变量,因为 javascript 中的所有内容都是全局的” 这绝对是错误的。
  • 进一步扩展一点,JavaScript 有一些非常奇怪的作用域(如果你不熟悉的话),但是“JavaScript 中的一切都是全局的”是完全错误的。就像,错误地逃离那个开发者。
  • 问那个人“你最后一次使用 JavaScript 是什么时候?”

标签: javascript scope


【解决方案1】:

那个开发者错了。这两个 myvar 是不同的。外面的相当于window.myvar,但里面的只是f里面。

编辑:一个非常简单的例子:http://jsfiddle.net/mRkX3/

编辑 2:

ECMAScript 标准的引用:

如果变量语句出现在 FunctionDeclaration 中,则变量在该函数中定义为函数局部范围,如第 10.1.3 节所述。否则,它们使用属性属性 { DontDelete } 在全局范围内定义(即,它们被创建为全局对象的成员,如 10.1.3 节所述)。进入执行范围时会创建变量。 Block 没有定义新的执行范围。只有 Program 和 FunctionDeclaration 会产生新的作用域。变量在创建时初始化为未定义。具有 Initialiser 的变量在执行 VariableStatement 时分配其 AssignmentExpression 的值,而不是在创建变量时。

通过http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting 找到,尽管该文章引用了死链接(实时链接:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf)。

【讨论】:

    【解决方案2】:

    听起来像是沟通中断。我敢打赌,他试图表明您可以通过将全局变量附加到窗口对象来从函数内部定义全局变量。试试:

    function f()
    {
        window.myvar = "something";
    }
    
    myvar = "c"; // overwriting "something"
    

    【讨论】:

      【解决方案3】:

      在你的例子中:

      function f(){
          var myvar = "something";
      }
      
      myvar = "c";    //nope, they are different.
      

      myvar = "c"指的是window.myvar,和f()里面的myvar不一样。除非在函数外部声明,否则无法访问函数内部的变量。

      var myvar;
      
      function f(){
          myvar = "something";
      }
      
      myvar = "c";    //now it changes "something" to "c"!
      

      【讨论】:

        【解决方案4】:

        是的,你是对的。在函数范围内声明的变量将无法在函数之外访问。如果函数返回myvar,则可以直接访问其值,但不能直接访问变量。

        【讨论】:

          【解决方案5】:

          在你的情况下,myVar 在函数的范围内,如果它是用 var 定义的,它永远不会被外部访问,但如果它没有被定义,那么你将 myVar 设置为全局对象( window ) 会带来很多麻烦。

          function(f) {
          myVar = "hello"
          }
          

          在这种情况下你可以找到myVar,因为它没有在函数内部定义。

          【讨论】:

            【解决方案6】:

            从他使用的示例 (for(var i in window)) 来看,他显然指望将您的函数变量声明为全局变量(没有 var 继续它们)。

            由于在这种情况下所有定义的变量都绑定到window 对象,因此只需遍历窗口对象即可轻松访问它们。但是,如果您使用 var 声明局部函数变量,它们将仅对函数本身可用(window 对象不会包含它们)。

            【讨论】:

              【解决方案7】:
              function f()
              {
                 var myvar = "Moon";
              }
              
              f();
              
              myvar = "Sunlight";
              

              【讨论】:

                猜你喜欢
                • 2011-04-15
                • 1970-01-01
                • 2020-03-03
                • 2017-05-25
                • 1970-01-01
                • 2011-11-25
                • 2011-01-25
                • 2017-03-08
                • 1970-01-01
                相关资源
                最近更新 更多