zoukankan      html  css  js  c++  java
  • 同名函数的覆盖问题 Amy

    JS解释器对使用function语句声明的函数,会在预编译阶段处理,对匿名函数在预编译阶段视而不见,在执行期才按表达式逐行进行解释执行,由于函数声明和函数表达式解析的视觉不同,因此导致函数拥有不同的特性

    一、

    function f(){
        alert(1);
    }
    f();//2
    function f(){
        alert(2);
    }
    f();//2,第二个f函数会覆盖第一个f函数

    JS解释器在预编译阶段就会把所有使用function语句声明的函数进行处理,如果发现同名函数,则用后者覆盖前者,在执行期,调用f函数时,只剩下了最后的那个同名函数

    二、

    var f=function(){
        alert(1);
    }
    f();//1
    function f(){
        alert(2);
    }
    f();//1

    JS解释器在预编译阶段对var语句声明的变量进行索引,但是变量的初始化被忽略掉,直到执行期才为变量读取初始值,对function语句创建的函数,JS解释器不仅对函数名按照变量标识符进行索引,而且对函数体也进行了处理,因此,在预编译阶段,同名变量f被同名函数f所覆盖

    但是在执行期,同名变量f被初始化为一个匿名函数,又覆盖了在预编译阶段指向的函数,指向另一个函数

    三、

    function f(){
        alert(1);
    }
    f();//1
    var f=function(){
        alert(2);
    }
    f();//2

    在预编译阶段,利用function语句声明的函数名进行索引,对函数体进行了处理,但是对利用var声明的变量仅进行索引,后面初始化的值(即匿名函数体)被忽略掉,

    因此在执行阶段,第一次调用f函数时,指向的是利用function语句声明的函数体,在执行到匿名函数部分时,为变量f初始化值,指向匿名函数,覆盖原有函数体,调用结果为2

  • 相关阅读:
    IPython notebook(Jupyter notebook)指定IP和端口运行
    spark-2.2.0安装和部署——Spark集群学习日记
    安装Scala-2.11.7——集群学习日记
    hadoop2.7.3在centos7上部署安装(单机版)
    Centos7下面配置静态IP
    css 3列
    css 日历组件(浮雕效果)
    if(!document.getElementById) return false; JS里这句是什么意思?
    网页中图片路径错误时显示默认图片方法
    css3 图片放大缩小闪烁效果
  • 原文地址:https://www.cnblogs.com/amy2011/p/3131657.html
Copyright © 2011-2022 走看看