zoukankan      html  css  js  c++  java
  • JavaScript 关于变量作用域的一道面试题

    ShineJaie 原创,转载请注明出处。

    昨晚在一个交流群里看到有位网友提了一个他的面试题求助答疑。刚好我也有看到,就对这个问题思考了一下,觉得这道题对理解 JavaScript 作用域还是很有帮助的,特此又把自己的解题思路梳理了一遍,希望对其它人有所帮助。

    首先看下面试题:

     1     var arr = [1, 2, 3];
     2     for (var i = 0, j; j = arr[i++];) {
     3         console.log(j);
     4     }
     5 
     6     console.log('---------');
     7     console.log(i);
     8     console.log('---------');
     9     console.log(j);
    10     console.log('---------');

     

    在解题前,我们先回顾下 JavaScript 中,变量域相关的知识。

    全局变量(Global)

    全局变量是指在任何地方都可以访问的变量,有两种情况

    • 在 function 外面声明,不论是否用 var 关键字
    • 在 function 里面声明,不使用 var 关键字,当然声明的语句必须被执行才可以

    局部变量(Local ) 

    局部变量只能在被声明的 function 内部才能访问
    • 在 function 里面声明,使用 var 关键字

    两点要注意的地方

    先看代码:

    1 alert(i); // 输出 undefined
    2 
    3 for (var i = 0; i < 1; i++){};
    4 
    5 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

    最后输出结果为:

    1
    2
    3
    ---------
    4
    ---------
    undefined
    ---------

    针对上面的分析和结果,想必大家都已经搞清楚了吧,然后我们开始举一反三吧。

    借题改题一

    题目:

     1     var arr = [1, 2, 3];
     2     for (var i = 0, j; j = arr[++i];) {
     3         console.log(j);
     4     }
     5 
     6     console.log('---------');
     7     console.log(i);
     8     console.log('---------');
     9     console.log(j);
    10     console.log('---------');

    答案:

    1 2
    2 3
    3 ---------
    4 3
    5 ---------
    6 undefined
    7 ---------

    借题改题二

    题目:

     1     function xxx() {
     2         var arr = [1, 2, 3];
     3         for (var i = 0, j; j = arr[i++];) {
     4             console.log(j);
     5         }
     6     }
     7     xxx();
     8 
     9     console.log('---------');
    10     console.log(i);
    11     console.log('---------');
    12     console.log(j);
    13     console.log('---------');

    答案:

    1
    2
    3
    ---------
    报错:Uncaught ReferenceError: i is not defined
  • 相关阅读:
    什么是原型(prototype)
    angularjs input指令
    angularjs 弹出框 $modal (转)
    windows下安装wabt
    windows下安装emscripten
    windows下安装mingw
    windows下安装git
    windows下安装cmake
    windows下安装python
    trunc与round
  • 原文地址:https://www.cnblogs.com/shinejaie/p/5253034.html
Copyright © 2011-2022 走看看