zoukankan      html  css  js  c++  java
  • js作用域小记var变量和function区别

    首先来一个例子做实验

    function createD(){
        var dir = {
            name: "d",
            ctrl: myCtrl,
            ctrl2: yourCtrl
        };
        return dir;
    
        function myCtrl (){
            console.log('my ctrl');
        }
    
        var yourCtrl = function(){
            console.log('your ctrl');
        };
    }
    
    var d = createD();
    d.ctrl();
    d.ctrl2();

    可以猜一下输出结果

    //输出:

    d.ctrl();                //输出: my ctrl               
    d.ctrl2();               //输出: Uncaught TypeError: d.ctrl2 is not a function

    首先以上例子中的写法其实不太符合规范,变量及函数的定义最好都放在前边。

    var的function的声明是不同的, var的声明会让变量声明提升到作用域顶部,但是变量的赋值还是在原位, 所以变量赋值如果在return后,也不会执行。 而function声明的话,会全部提升到顶部执行。

    所以,createD() 里边的 yourCtrl变量实际是undefined  还没有来的及赋值即return掉了。

    预编译后的代码会如下:

    function createD(){
        var dir = {
            name: "d",
            ctrl: function(){
                console.log('my ctrl');
            },
            ctrl2: yourCtrl
        },
        yourCtrl;
        
        return dir;
    
        yourCtrl = function(){
            console.log('your ctrl');
        };
    }
     js预编译时,会扫描作用域, 将作用域内的函数声明提升到作用域顶部。而执行代码还在原位。
    例如
    function(){
      console.log('start');
      var a = 1;
    }
    经过预编译后,会变成:
    function(){
      var a;
      console.log('start');
      a = 1;
    }

    即使这个var a在if的花括号内,也会被提前。

    所以,我们常常强调的编码规范还是很有存在意义的!

  • 相关阅读:
    poj2115
    poj2136
    软件的架构与设计模式之模式的种类
    SOA: My Understanding (转载未来技术方向)
    深度管理Remote Objects的生存期 (转载)
    SmartClient(智能客户端) 转载
    Windows Communication Foundation入门(Part One)
    使用.NET Remoting开发分布式应用——基于租约的生存期(转载)
    软件设计模式C#
    MarshalByRefObjects远程对象及其调用方法
  • 原文地址:https://www.cnblogs.com/yangzhx/p/4699472.html
Copyright © 2011-2022 走看看