zoukankan      html  css  js  c++  java
  • JavaScript提升(Hosting)及其优先级

    本文的说明从解释{JavaScript中常见的错误“如Uncaught TypeError: x is not a function”}入手。

    在JavaScript开发中经常能碰到错误“Uncaught TypeError: x is not a function”,明明已经声明和赋值了,但是仍然报错。纠其原因,除了函数本身有错之外,还有一种很奇怪的情况:函数本身没有错,但是运行时就是不能正常运行。这种情况与JavaScript的特性有关:变量与函数声明前置的优先级

    首先看代码:

    console.log(x)
    console.log(x());
    var x=1;
    function x(){
    console.log(5);
    }
    console.log(x)
    console.log(x());//此时x变成了一个变量

    输出结果:

    function x(){
                    console.log(5);
     }

    5

    1
     Uncaught TypeError: x is not a function

    第一次输出x时,输出的是x函数,但是x变量的声明在x函数之前,就算要输出也应该输出的是undefined,为什么会输出函数?
    JavaScript上下文中无非就是变量、函数、函数参数,那么js解释器在对其上下文进行解释执行时分为三个阶段来进行:声明阶段、初始化阶段、执行阶段。

    针对js上下文,首先会进行声明阶段,声明阶段中的特点是声明前置;声明又会包括变量声明前置和函数声明前置,鉴于以上代码的输出结果,我们可以得出函数声明前置优先于变量声明前置的特点,并且如果变量名和函数名冲突会忽略变量的声明,因此声明过得变量名或函数名不会重复声明,这样也可以很好地解释为什么第一次输出的是函数而不是undefined。根据js的这些特点我们可以将以上代码解析成如下:

    //声明阶段
    function x(){//函数声明
    console.log(5);
    }
    var x;//变量声明,因为x已经声明过了,此处不进行声明(忽略)
    //执行阶段
    console.log(x);
    console.log(x());
    x=1;
    console.log(x);
    console.log(x());

    如上代码所述,js将变量和函数的声明前置,然后再执行代码。

    第二次输出时,因为声明阶段已经声明过名为x的函数,所以在执行阶段中调用x函数,会执行函数体中的内容。
    第三次输出时,输出1,因为x被赋值为1.
    第四次输出时,因为x此时是一个变量而不是一个函数,所以js无法解释“变量()”这样的格式,就会提示“x is not a function”。
    JavaScript中声明过得变量名或函数名不会重复声明,如果js代码中有同名的函数或同名的变量时,程序如何运行,如下代码:

    console.log(x)
    console.log(x());
    var x=1;
    var x=100;
    function x(){
    console.log(5);
    }
    function x(){
    console.log(500);
    }
    console.log(x)
    console.log(x());//此时x变

    根据JavaScript解析代码的特点,将代码解析成如下:

    //声明阶段
    function x(){//函数声明
    //console.log(5);此句会被下句代码覆盖
    console.log(3);
    }
    var x;//变量声明,因为x已经声明过了,此处不进行声明(忽略)
    //执行阶段
    console.log(x);
    console.log(x());
    x=1;
    x=100;//x的值被覆盖
    console.log(x);
    console.log(x());

    所以输出的结果就是:

    function x(){
                    console.log(3);
     }

    3

    100
     Uncaught TypeError: x is not a function

    针对变量名同名或函数名同名的情况,我们又可以得出一个特点:如果声明了同名的函数其定义会被后者覆盖,声明了同名的变量其值也会被后者覆盖。
    ————————————————

    个人觉得这篇博文特别深刻,特意转载到自己的博客。

    附:本文属于转载CSDN博主「JEE__hh」的原创文章,原文链接:https://blog.csdn.net/weixin_40345099/article/details/82912474

  • 相关阅读:
    Median Value
    237. Delete Node in a Linked List
    206. Reverse Linked List
    160. Intersection of Two Linked Lists
    83. Remove Duplicates from Sorted List
    21. Merge Two Sorted Lists
    477. Total Hamming Distance
    421. Maximum XOR of Two Numbers in an Array
    397. Integer Replacement
    318. Maximum Product of Word Lengths
  • 原文地址:https://www.cnblogs.com/qingtian-jlj/p/12082717.html
Copyright © 2011-2022 走看看