zoukankan      html  css  js  c++  java
  • js笔记——js里var与变量提升

    var是否可以省略

    一般情况下,是可以省略var的,但有两点值得注意:

    1、var a=1a=1 ,这两条语句一般情况下作用是一样的。但是前者不能用delete删除。不过,绝大多数情况下,这种差异是可以忽略的。
    2、在函数内部,如果没有用var 进行申明,则创建的变量是全局变量,而不是局部变量了。

    所以,建议变量申明加上var关键字。

    变量提升

    JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。

    示例:

    console.log(a);
    var a =1;
    

    以上语句并不会报错,只是提示undefined。实际运行过程:

    var a;
    console.log(a);
    a =1;
    

    表示变量a已声明,但还未赋值。但是变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。

    console.log(aa);
    aa =1;
    

    以上代码将会报错:ReferenceError: aa is not defined


    与普通变量一样,js里的function也可看做变量,也存在变量提升情况:

    a();
    
    function a(){
        console.log(1);
    };
    

    表面上,上面代码好像在声明之前就调用了函数a。但是实际上,由于“变量提升”,函数a定义部分被提升到了代码头部,也就是在调用之前已经声明了。但是,如果采用赋值语句定义函数,JavaScript就会报错:

    a();
    
    var a = function(){
        console.log(1);
    };
    
    // TypeError: a is not a function
    

    因为,实际运行过程:

    var a;
    a();
    
    a = function(){
        console.log(1);
    };
    

    这时候a是个变量,并非function

    参考:
    http://javascript.ruanyifeng.com/grammar/basic.html#toc3

  • 相关阅读:
    如何用正确的方法写出高质量软件的75条体会(转)
    使用javascript动态添加onclick事件,
    签名和重载
    C#文件后缀名详解
    配置SQL Server 2005 Express的身份验证方式,以及如何启用sa登录名。
    CSS选择符及优先级计算
    关于软件版本的解释
    数据结构形象解释
    CSS属性选择符
    [转载]Repeater三层嵌套
  • 原文地址:https://www.cnblogs.com/52fhy/p/5117267.html
Copyright © 2011-2022 走看看