• 关于var与function的解析顺序问题


    先给几段代码,看看你能知道运行结果不

    function example1() { 

        var f = function() {return 1;}; 

        return f; 

        var f = function() {return 2;}; 

    var a1 = example1(); 

    alert(a1()); 

    function example2() { 

        function f() {return 1;}; 

        return f; 

        function f() {return 2;}; 

    var a2 = example2(); 

    alert(a2()); 

    function example3() { 

        function f() {return 1;}; 

        return f; 

        var f = function() {return 2;}; 

    var a3 = example3(); 

    alert(a3()); 

    function example4() { 

        var f = function() {return 1;}; 

        return f; 

        function f() {return 2;}; 

    var a4 = example4(); 

    alert(a4()); 

    function example5() { 

        var f = function() {return 1;}; 

        function f() {return 2;}; 

        return f; 

    var a5 = example5(); 

    alert(a5()); 

    function example6() { 

        function f() {return 1;}; 

        var f = function() {return 2;}; 

        return f; 

    var a6 = example6(); 

    alert(a6()); 

    function example7() { 

        function f() {return 1;}; 

        var f = function() {return 2;}; 

        var f; 

        return f; 

    var a7 = example7(); 

    alert(a7()); 

    先给出运行结果1,2,1,1,1,2,2

    解释一下,这里必须搞清楚js在解析运行时会把声明放在前边,比如var a=1;那解析时会把var放在当前作用域最前面进行解析,而a=1只是个赋值操作,解析运行时位置不变,举个简单的例子,比如有如下代码:

    alert(f); 

    执行时肯定会报错,因为f未定义,如果我们改写成如下代码

    var f = function(){}; 

    alert(f); 

    那一定会打印function(){},这个地球人都知道,如果把代码写成下面样子

    alert(f); 

    var f = function(){}; 

    那么可能有人就不太注意了,这时候执行是不会报错的,打印的是undefined,因为执行时会把声明提前,所以上面的代码在解析执行时,实际上变成了以下代码:

    var f; 

    alert(f); 

    f = function(){}; 

    然后再说一下function,function是一种声明加赋值的写法,还是继续上面的例子,先给出一段代码

    alert(f); 

    function f(){} 

    这时候会打印出function f(){},我们可以看到使用function进行函数定义时,不仅声明提前了,就连赋值也提前了,上面的代码在解析执行时,实际变成这样

    var f; 

    f = function f(){}; 

    alert(f); 

    接下来我们讨论var 与 function一起出现的时候优先级问题,function的优先级要大于var,也就是function的声明会在var前面,并且function的赋值会在等号赋值的前面,我们就分析一下文章开关的example5的代码

    function example5() { 

        var f = function() {return 1;}; 

        function f() {return 2;}; 

        return f; 

    var a5 = example5(); 

    alert(a5()); 

    我们看到var和function都声明了一个变量f,而且这个f进行了两次赋值,一次是直接用等号赋值,另一次是function赋值,依据前面的优先级规则,function的声明和赋值都会优先,所以这段代码在解析执行时变成了下面的代码:

    function example5() { 

        var f; // function声明 

        var f; // var声明 

        f = function f() {return 2;}; // function赋值 

        f = function() {return 1;}; // 等号赋值 

        return f; 

    var a5 = example5(); 

    alert(a5()); 

    所以最后的运行结果为1。

    案例

    1 function example() { 

        f = 1; 

        return f; 

        function f(){return 1;}; 

    var a = example(); 

    alert(f);

    执行结果为1

    2 function fun(){

        alert(0);

    }

    fun();

    var fun = function(){

        alert(1);

    }

    fun();

    var fun = function(){

        alert(2);

    }

    fun(); 

    function fun(){

        alert(3);

    }

    fun();

    结果是3 1 2 2

  • 相关阅读:
    Some day some time we will do
    qemu-img 的使用
    虚拟化qemu-img的简单用法。
    linux 后台执行命令
    C#向服务器上传文件问题
    Canvas保存为图片
    一个Sql备注
    fabric Clone
    Js 正则获取Html元素
    Graphic 完成文字缩放
  • 原文地址:https://www.cnblogs.com/ranyonsue/p/7451784.html
Copyright © 2020-2023  润新知