一道关于JavaScript变量作用域的面试题
小编觉得这道题对理解JavaScript作用域还是很有帮助的,特此又把自己的解题思路梳理了一遍,希望对其它人有所帮助。
首先看下面试题:
vararr=[1,2,3]; for(vari=0,j;j=arr[i++];){ console.log(j); } console.log('---------'); console.log(i); console.log('---------'); console.log(j); console.log('---------');
在解题前,我们先回顾下JavaScript中,变量域相关的知识。
全局变量(Global)
全局变量是指在任何地方都可以访问的变量,有两种情况
在function外面声明,不论是否用var关键字
在function里面声明,不使用var关键字,当然声明的语句必须被执行才可以
局部变量(Local)
局部变量只能在被声明的function内部才能访问
在function里面声明,使用var关键字
两点要注意的地方
先看代码:
alert(i);//输出undefined for(vari=0;i<1;i++){}; alert(i);//输出1
JavaScript不存在语句作用域,在语句内定义的变量会扩散到语句外边,例子中i在for语句中声明,但是在for语句的外面任然可以访问
在for语句之前就可以访问到i,只不过这时候还没有被赋值
开始我们的解题
i++是在i使用后再自加:
第一次执行时,j=arr[0],之后i=1,console.log(j)输出1
第二次执行时,j=arr[1],之后i=2,ocnsole.log(j)输出2
第三次执行时,j=arr[2],之后i=3,ocnsole.log(j)输出3
第四次(不符合for 条件),j=arr[3]为undefined,之后i=4,ocnsole.log(j)没有输出,退出for循环
for语句执行结束后,console.log(i)由上分析可知输出4,console.log(j)输出undefined
最后输出结果为:
2 --------- --------- undefined ---------
针对上面的分析和结果,想必大家都已经搞清楚了吧,然后我们开始举一反三吧。
借题改题一
题目:
vararr=[1,2,3];
for(vari=0,j;j=arr[++i];){ console.log(j); } console.log('---------'); console.log(i); console.log('---------'); console.log(j); console.log('---------');
答案:
2 3 --------- 3 --------- undefined ---------
借题改题二
题目:
functionxxx(){ vararr=[1,2,3]; for(vari=0,j;j=arr[i++];){ console.log(j); } } xxx(); console.log('---------'); console.log(i); console.log('---------'); console.log(j); console.log('---------');
答案:
1 2 3 --------- 报错:UncaughtReferenceError:iisnotdefined
为大家就分享到这,希望对大家理解JavaScript作用域有所帮助。