Javascript 是否可以从函数外部访问函数局部变量?
我今天听说“可以访问函数的局部变量,因为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
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";