点此查看完整干净版本: JavaScript作用域的迷惑题(arguments运行时状态更改)
中华图网
->
网页设计交流
->
JavaScript作用域的迷惑题(arguments运行时状态更改)
登录
->
注册
->
回复主题
->
发表主题
越兔
2008-08-21 10:00
转于石头君BLOG:
http://www.v-ec.com/dh20156/article.asp?id=179
好奇同学给出的一段代码,很具有迷惑性。
Code:
<script type="text/javascript">
var a = function () {
return d();
};
var d = function () {
alert(a.arguments[0]);
return function () {
alert(a.arguments);
};
};
a(1);//结果?
alert(a.arguments);//结果?
var c = a(2);//结果?
c();//结果?
</script>
[可以先修改代码再运行]
说说看,你猜测的结果是什么?
好吧,Run一遍吧,结果是:
Quote:
1
null
2
null
我开始也对这个结果感到奇怪。按照词法作用域的定义,函数d是运行在它被定义的作用域里的,它访问a.arguments应该是window.a.arguments,本以为它会访问到一个静态的a.arguments,即null,没想到居然访问到了a在运行时状态下的arguments。
原来,在d执行时,a的状态已经被更改,它处在一个运行时状态,这个时候window.a.arguments也被更改了,直到a运行结束,window.a.arguments才被重新更新。这样,也就有了上题的结果。
所以,对作用域的理解是没有问题的,主要是arguments的运行时状态更改值得注意!
另外,函数的arguments属性是只读的(arguments成员是可读写的,参见
http://www.v-ec.com/dh20156/article.asp?id=141
)
Code:
<script type="text/javascript">
var a = function(){
alert(window.a.arguments);
}
a.arguments = {0:1,1:2};
alert(window.a.arguments);//null
a();//[object Object]
a(1);//[object Object]
alert(window.a.arguments);//null
</script>
[可以先修改代码再运行]
我们暂且认为,函数的arguments属性在该函数未运行状态下只是一个对象占位符(null),WC认为,也有可能是一种类似perl的local的实现。
只有在函数运行时,不论该函数是否有参数,arguments才会转换为一个实际的对象,运行结束后,又恢复到null状态。
查看完整干净版本: JavaScript作用域的迷惑题(arguments运行时状态更改)
Powered by
Cntuw.com
Time 0.313388 second(s),query:3 Gzip enabled
You can
|