首页 > 编程语言 > 详细

JavaScript作用域链详解

时间:2015-12-31 12:27:19      阅读:134      评论:0      收藏:0      [点我收藏+]

<script>
var a=20;
function f1(){
var c=30;
alert(a);
function f2(c){
var c="abc";
alert(c);

}
f2("tom");

}
f1(); //

调用f1()后会弹出a=20 c=abc 解析 首先调用 f1()函数 f1函数的活动对象中并没有发现 a 于是上级作用域链中查找,发现a=20,于是弹出a=20,然后调用 f2("tom") 传入参数 tom 然而在f2()内部有变量C且已经重新赋值,且在f2()环境内已有变量C所以不用往上面的作用域中查找 所以 c!=30,而是 abc

<script>
var a=20;
function f1(){
var c=30;
alert(a);
function f2(c){
var c="abc";
alert(c);
function c(){
alert(1234);
}
}
f2("tom");

}
f1();
</script>

调用f1()后会弹出a=20 c=abc 解析 首先调用 f1()函数 f1函数的活动对象中并没有发现 a 于是上级作用域链中查找,发现a=20,于是弹出a=20,然后调用 f2("tom") 传入参数 tom 然而在f2()内部有变量C且已经重新赋值,且在f2()环境内已有变量C所以不用往上面的作用域中查找 又因为函数会先执行,所以function c()先执行 然后再给变量赋值 此时C()函数已被变量C覆盖所以 C的值仍是abc不会改变

<script>
var a=20;
function f1(){
var c=30;
alert(a);
function f2(c){
alert(c);
function c(){
alert(1234);
}
}
f2("tom");

}
f1();
</script>

调用f1()后会弹出a=20

c=function c(){
alert(1234);
}

 解析 首先调用 f1()函数 f1函数的活动对象中并没有发现 a 于是上级作用域链中查找,发现a=20,于是弹出a=20,然后调用 f2("tom") 传入参数 tom 然而在f2()内部已有函数c()的定义,又因为内部的优先级大于外部的优先级所以alert(c)实际上会弹出函数c的定义

<script>
var a=20;
function f1(){
var c=30;
alert(a);
function f2(c){
alert(c);
}
f2("tom");

}
f1();

解析 首先调用 f1()函数 f1函数的活动对象中并没有发现 a 于是上级作用域链中查找,发现a=20,于是弹出a=20,然后调用 f2("tom") 传入参数 tom ,然后在函数C内部已发现有C传过来的变量,这时就不在往上面的作用域中查找所以 会弹出 C=tom

<script>
var a=20;
function f1(){
var c=30;
alert(a);
function f2(c){

alert(c);

}
f2();

}
f1();
</script>

调用f1()后会弹出a=20 c=undefined解析 首先调用 f1()函数 f1函数的活动对象中并没有发现 a 于是上级作用域链中查找,发现a=20,于是弹出a=20,然后f2需要传递一个参数,实际上并没传递,而在f2()的环境中有形参c所以会显示undefined

<script>
var a=20;
function f1(){
var c=30;
alert(a);
function f2(){

alert(c);

}
f2();

}
f1();
</script>

调用f1()后会弹出a=20 c=30解析 首先调用 f1()函数 f1函数的活动对象中并没有发现 a 于是上级作用域链中查找,发现a=20,于是弹出a=20,然后f2 函数的活动对象中并没有发现c 于是上级作用域链中查找,发现c=30

JavaScript作用域链详解

原文:http://www.cnblogs.com/moyuxuan/p/5091201.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!