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

学习作用域链有个地方不明白,问问大家
测试代码是
<html>
<head>
<script type="text/javascript">
var a,b,c;
a=3;
function xy(){
var d,e,f,k,n;
d=5;
e=10;
f=20;
return c;
k=51;
}
var l,t;
c=50;
b=xy();
l=52;
alert(b);
</script>
</head>
</html>


Window对象的[[scope]]属性的值为一个队形列表,其中有一个元素,这个对象列表是
[
{
a:
b:
c:
xy:-------
l:
t:
}
]
---------表示值是函数,其余的值是undefined。
此时xy对象的[[scope]]属性的值为空。
在语句a=3;之后,[[scope]]属性的值为
[
{
a:3,
b:
c:
xy:-------
l:
t:
}
]
在“functionxy(){”这一行,函数对象xy的[[scope]]属性的值改变,为
[
{
a:3
b:
c:
xy:-------
l:
t:
}
]
在“c=50;”这行执行完毕后,window对象的[[scope]]属性的值为
[
{
a:3
b:
c:50
xy:-------
l:
t:
}
]
在下一行,执行函数xy,并将返回值赋给b。进入xy函数体后,创建活动对象,并将其送入xy对象,此时
xy对象的[[scope]]属性的值为
[
{
a:3
b:
c:
xy:-------
l:
t:
},

{
d:
e:
f:
k:
n:
}
]
执行“return c;”之前,xy对象[[scope]]属性的值为
[
{
a:3
b:
c:
xy:-------
l:
t:
},

{
d:5
e:10
f:20
k:
n:
}
]
return c;语句在xy的[[scope]]属性的值中查找标识符c,其值为undefined,则b的值为undefined,最后alert(b)应该显示undefined,但测试结果为50,到底是哪出现问题了呢
------解决方案--------------------
在调用xy()时,全局变量c已经通过表达式 改变了预解析仓库中的值为50,xy()调用时,因为局部作用域未找到c,那么沿着作用域链往上找到c ,返回50