阿里巴巴js面试题1

来源:互联网 发布:大数据怎样赚钱 编辑:程序博客网 时间:2024/06/04 19:05

转载自http://blog.csdn.net/qq_27682041/article/details/76473068

该题难度系数: ★★★

考查的技术点:  1). 变量提升 2). 函数提升  3). 预处理  4). 调用顺序

[php] view plain copy
  1. var c = 1;  
  2. function c(c) {  
  3.     console.log(c);  
  4.     var c = 3;  
  5. }  
  6. c(2);  


运行结果:



看到这结果有没有大吃一惊?

我们现在来分析下原因。

这里我们先来了解下“预处理”,那什么是预处理呢?js语言本身具有预处理机制,js引擎在预处理期对所有声明的变量和函数进行处理,就是先把变量进行声明并读到内存里。也就是收集用var声明的变量信息和函数声明信息

还有一点是预处理时,变量和函数的优先顺序,先变量后函数。当变量名和函数名一致时后者会覆盖前者,我们看下下面的小案例,

[javascript] view plain copy
  1. function b() {  
  2. }  
  3. var b  
  4. console.log(typeof b)  

结果为function,这就证实了,我们刚才的结论,执行顺序先变量后函数,变量名一致时,函数就会覆盖变量。

再来说一下预处理,看一下下面的小案例:

[javascript] view plain copy
  1. var a = 2    
  2. function fn() {    
  3.     console.log(a)    
  4.     var a = 3    
  5. }    
  6. fn()  


运行下,结果为undefined。

为什么为undefined呢?因为这里预处理顺序是这样的,外面声明了个全局变量a,值为2,但是里面把a声明成了局部变量,函数内部的预处理顺序为先声明var a;然后console.log(a);最后a=3;所以我们调用函数的时候,里面是有a,所以不会调外面的全局a,只是里面的a暂时还没有值,因为a=3这赋值步骤是在console.log(a)后面执行的,所以我们运行时就看到undefined了。拓展下,如果函数里面去掉var,那么打印出来的值就是2了,然后全局变量a又被赋值为3。

那好,我们现在回到我们刚才的题目上来,刚才题目的解析顺序可以理解为以下步骤:

先预处理var c;

然后预处理整个c函数

function c(c) {
            console.log(c)
            var c = 3
    }

此时c的typeof为function

接下来再给c赋值,值为1,即c=1,此时c是整型变量1.typeof为number了。

最后再执行c(2)调用函数。所以我们调用的时候当然就会报c不是一个函数的错误了,因为他现在是一个整型变量了啊,哈哈,是不是很伤脑筋啊……

最后我们再次运行以下代码,证实我们的结论:

[javascript] view plain copy
  1. var c = 1  
  2. function c(c) {  
  3.     console.log(c)  
  4.     var c = 3  
  5. }  
  6. console.log(c) //   
  7. console.log(typeof c) //   
  8. c(2) //  

结果截图:


再唠叨下,这题里面给我们设了陷阱,全局变量名、函数名、函数形参都是c,这是面试官为了迷惑我们的,考查我们的相关知识是否理解得透彻,分析是否仔细了。毕竟是名企面试题,很注重考查基础的……


原创粉丝点击