<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
原文:http://www.cnblogs.com/moyuxuan/p/5091201.html