zoukankan      html  css  js  c++  java
  • 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) //  


    结果截图:

  • 相关阅读:
    Android系统源代码下载
    Windows Embedded Compact 7初体验
    windowsmobile 开发环境
    Windows X64汇编入门(1)
    汇编语言的Hello World
    如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
    音频视频解决方案:GStreamer/ffmpeg/ffdshow/directshow/vfw
    汇编开发环境
    DirectX
    关于DirectShow SDK 和Windows SDK,及DirectX SDK
  • 原文地址:https://www.cnblogs.com/luckyXcc/p/9134270.html
Copyright © 2011-2022 走看看