JS变量作用域——搜孤前端面试题
请给出这段代码的运行结果( )
<SCRIPT LANGUAGE="JavaScript">
var bb = 1;
function aa(bb) {
bb = 2;
alert(bb);
};
aa(bb);
alert(bb);
</SCRIPT>
答案是什么呢?
首先 var bb = 1 是通过值传递,第一个函数调用 aa(bb) 因为aa(bb)函数里面又重新对bb进行了赋值,所以第一个alert(bb)输出的是2,这没有太大问题。
问题是第2个alert(bb),因为函数aa(bb)里面的bb = 2。
因为没有加上var,所以算是全局变量,但是第二个alert(bb)的值输出却不是2,而是1。
为什么呢?
因为函数aa(bb)的形参名为bb。
假如形参名不是bb,改成cc:
如同上面这段代码一样,则输出是2 2。
而若是下面这段代码:
第二个alert(bb)输出的则是undefined,如图所示。
也就是说在这里,函数声明的时候,带了一个参数bb,也就是相当于在函数体内声明了var bb。
所以函数执行时会输出2。函数执行完后,函数的活动对象被销毁,也就是局部的这个bb被删除了,执行流进入到window,再输出bb,值就是1了。