js变量、函数提升和闭包相关练习题
案例01
1.代码
<script>
var a = 1;
var obj = { name:"wangcai" };
function f() {
var a2 = a;
obj2 = obj;
a2 = a;
obj.name = "xiaoqiang";
}
f();
console.log(a);
console.log(obj);
</script>
2.运行结果
3.原理
解析:全局变量中,var a;var obj;函数f()进行了提升,程序执行后a的值为 1,obj的值为name:“wangcai”。在函数内部定义一个变量a2,将全局变量a的值赋值给a2,接着把全局变量obj的值赋值给全局变量(VO)obj2,因为a2是函数内部的局部变量,a2的值变为1,但是全局变量中的a没有发生改变。在函数内部,obj将内部的变量修改为"xiaoqiang",最终输出结果为1 {name:“xiaoqiang”}.
案例02
1.代码
<script>
var arr = [11,22];
function f(ary) {
console.log(ary);
ary[0] = 100;
ary = [666];
ary[0] = 0;
console.log(ary);
}
f(arr);
console.log(arr)
</script>
2.运行结果
3.原理
解析:程序编译前,arr、函数f(ary)进行提升,程序执行之后arr = [11,22]。调用函数时,函数内部传入参数ary,ary,所以首先输出ary的值。接着数组的第一个数赋值为100,即将数组内11改为100。当运行到ary = [666]时,ary数组开辟了新空间,得到了新的地址,这时ary的值为[666],紧接着ary[0]=0,把666数值修改为0。这时的输出结果为0。arr是全局变量,存储在EC(G)的VO中,所以arr的输出结果为[100,22]。
案例03
1.代码
<script>
var a = 1;
var b = 1;
function f() {
console.log(a, b)
var a = b = 2;
console.log(a, b)
}
f();
console.log(a, b)
</script>