是否可以从函数外部访问函数局部变量?

时间:2012-03-29 03:22:15

标签: javascript scope

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

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

例如,

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

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

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

更新

我问了他一段代码片段,这就是我收到的内容。

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);

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

7 个答案:

答案 0 :(得分:6)

开发人员错了。那两个 myvar 是不同的。外面的一个等同于window.myvar,但内部的一个只在 f 中。

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

编辑2:

ECMAScript标准的引用:

  

如果变量语句出现在FunctionDeclaration中,则变量在该函数中使用函数局部作用域定义,如10.1.3节所述。否则,它们使用属性属性{DontDelete}定义为全局范围(即,它们是作为全局对象的成员创建的,如10.1.3节中所述)。输入执行范围时会创建变量。块不定义新的执行范围。只有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)。

答案 1 :(得分:4)

听起来像通讯故障。我打赌他试图指出你可以通过将它附加到窗口对象来从函数内部定义一个全局变量。尝试:

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

myvar = "c"; // overwriting "something"

答案 2 :(得分:3)

在你的例子中:

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

myvar = "c";    //nope, they are different.

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

var myvar;

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

myvar = "c";    //now it changes "something" to "c"!

答案 3 :(得分:2)

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

答案 4 :(得分:2)

在你的情况下myVar在函数的范围内,如果在var中定义它,它将永远不会被外部访问,但是如果没有定义,则设置myVar到全局对象(窗口),它可能会导致很多麻烦。

function(f) {
myVar = "hello"
}

在这种情况下,您可以找到myVar,因为它未在函数内定义。

答案 5 :(得分:2)

根据他使用的例子(for(var i in window))判断,他显然指望你的函数变量被声明为全局(没有var继续它们)。

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

答案 6 :(得分:-1)

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

f();

myvar = "Sunlight";