Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以从函数外部访问函数局部变量?_Javascript_Scope - Fatal编程技术网

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

Javascript 是否可以从函数外部访问函数局部变量?,javascript,scope,Javascript,Scope,我今天听说“可以访问函数的局部变量,因为javascript中的所有内容都是全局的” 据我所知,您不能从变量范围之外访问局部变量 比如说, function f() { var myvar = "something"; } myvar = "c"; // i'm not accessing myvar in f(); 我还听说可以使用for(窗口中的var I)访问myvar。我想确认这是不可能的,因为我不是语言的作者 更新: 我问了他一段代码,下面是我收到的 var person

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

据我所知,您不能从变量范围之外访问局部变量

比如说,

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

myvar = "c"; // i'm not accessing myvar in f();
我还听说可以使用for(窗口中的var I)访问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);

它不是在访问变量……它只是在打印函数的外观……

开发人员错了。这两个myvar是不同的。外部的等效于window.myvar,但内部的等效于f

编辑:一个非常简单的示例:

编辑2:

来自ECMAScript标准的引用:

如果变量语句出现在FunctionDeclaration中,则变量在该函数中使用函数局部范围定义,如第10.1.3节所述。否则,它们将使用属性属性{DontDelete}定义为全局范围(即,它们被创建为全局对象的成员,如第10.1.3节所述)。变量是在输入执行范围时创建的。块不定义新的执行范围。只有程序和函数声明生成新的作用域。变量在创建时被初始化为未定义。带有初始值设定项的变量在执行VariableStatement时,而不是在创建变量时,分配其AssignmentExpression的值


尽管那篇文章引用了一个死链接(live link:)。

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

在您的情况下,
myvar
在函数的范围内,如果它是用
var
定义的,则外部永远无法访问它,但如果没有定义,则将myvar设置为全局对象(窗口)这可能会导致很多麻烦

function(f) {
myVar = "hello"
}

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

听起来像是通信中断。我打赌他试图指出,通过将全局变量附加到窗口对象,您可以从函数中定义全局变量。请尝试:

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

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

根据他使用的示例(
for(窗口中的var i)
)判断,他显然指望您的函数变量被声明为全局变量(而不是
var

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

在您的示例中:

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"!

“可以访问函数的局部变量,因为javascript中的所有内容都是全局的”这肯定是错误的。进一步说,javascript有一些非常奇怪的作用域(如果你不熟悉的话),但“javascript中的所有内容都是全局的”完全是错误的。比如,从开发人员那里跑开是错误的。问问那个家伙“您上次使用JavaScript是什么时候?”
function f()
{
   var myvar = "Moon";
}

f();

myvar = "Sunlight";