JS逻辑题 技术点: 1). 变量提升 2). 函数提升 3). 预处理 4). 调用顺序

考查的技术点:  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) //  


结果截图:

原文地址:https://www.cnblogs.com/luckyXcc/p/9134270.html