日期:2014-05-16  浏览次数:20382 次

局部变量和全局变量的讨论,谢谢。。。
学习到js的局部变量和全局变量的作用域时候遇到的问题,在js群中跟大家讨论了,还是不太确定,谢谢大家帮忙看一下!谢谢
聊天记录如下:

武汉js学习者 14:31:34
大仙们,帮我看段代码,刚刚看到第4章
  <script language="javascript">
var x=10;
function f()
{
document.write("x的值为:"+x+"<br>");
var x=20;
document.write("x的值为:"+x);
}
f();
</script>
武汉js学习者 14:33:07
最终输出的结果是:
x的值为:undefined
x的值为:20 
thea 14:36:27
全局变量吧

武汉js学习者 14:36:52
恩,局部变量和全局变量

x=10是全局
thea 14:37:37
是的 后面又定义X=20

覆盖了前面

武汉js学习者 14:37:50
后面的局部变量
thea 14:38:09
后面也是全局的
武汉js学习者 14:38:12
局部变量的作用域应该在函数体里面吧
只有局部变量和全局变量冲突的时候以局部变量为准
黑子~~ 14:38:40
var 会优先解析
var;
document.write()
x = 20;
武汉js学习者 14:39:00
x的值为:undefined 是什么情况呢
黑子~~ 14:39:07
 var x;
武汉js学习者 14:39:30
谢谢黑子和thea
如果只是 var x;没有赋值 出来的应该是 undefined
但是上面都赋值了哦
黑子~~ 14:40:26
你是在函数内部.
下面var x = 20 但是解析器会先 var x;
这个时候..在内部的时候..访问x 是不会访问到全局上面的X的
武汉js学习者 14:41:57
  <script language="javascript">
var x=10;
function f()
{/ar x=20;
document.write("x的值为:"+x+"<br>");

document.write("x的值为:"+x);
}
f();
</script>
黑子,注释掉了里面的var,输出的都是10了,输出了全局变量
黑子~~ 14:43:44
这就是对的
武汉js学习者 14:44:42
也就是说如果全局和局部冲突,局部起作用,在函数体中优先解析var x;不管他在多少行,但是不赋值对吗?

黑子~~ 14:44:58
变量会有限在当前作用域找..如果找不到在到上一层找..直到顶层未
差不多


------解决方案--------------------
先在作用域链中查找,找到就要当前作用域中的,否则一直向上查找直至全局作用域。找到了但在声明前使用所以为undefined
------解决方案--------------------
意思差不多了, LZ想要了解底层怎么处理的, 去搜 变量对象/活动对象相关文章 Variable Object / Activation Object

局部变量 全局对象LZ应该知道, 只有函数能创建新的上下文, 有局部变量的情况下肯定先用局部变量. 如果没有, 找父级直至全局.

为什么是undefined, 深层次理解可以去查 Activation Object 相关知识. 对于函数来讲, 进入上下文阶段, 函数的参数是有值的(如果给函数的相应形参传了值的话), 函数内部通过 var (注意必须有VAR)定义的参数, 全部赋 undefined 为初值, 在执行上下文的时候才真正赋值(如例子中的 var x=20; 执行到这句的时候才有了 20).

函数的执行有2个阶段, 进入上下文(各种声明)和执行上下文代码.

求给分 =.=