zoukankan      html  css  js  c++  java
  • 变量提升和块级作用域

    变量提升

    JavaScript引擎的工作方式是先解析代码,获取所有被声明的变量,然后一行一行的执行。所有变量的声明语句被提升到代码的头部,这就叫变量提升。

    实例1:

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

    以上语句不会报错,只提示 undefined 。

    实际运行过程:

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

    变量a已经声明,但还未赋值。

    变量的提升只会对var命令声明的变量有效,其他不是用var命令声明的变量,不会发生变量的提升。

    实例2:

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

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

     

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

    实例3:

    1 a();
    2 function a(){
    3   console.log(1);  
    4 }

    表面上声明之前调用函数a。由于变量提升,函数a定义部分被提升到了代码头部,即调用之前已经声明。

    采用赋值语句定义函数会报错 TypeError: a is not a function 。

    实例4:

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

    以上代码会报错 TypeError: a is not a function 

    实际运行过程:

    1 var a;
    2 a();
    3 a=function(){
    4   console.log(1);  
    5 }

    这个时候啊是个变量,并不是function。

    块级作用域

    let取代var

    ES6提出的两个新的声明变量: let 和 const 。let可以完全取代var,两者语义差不多,let没有副作用。

    console.log(x); // ReferenceError
    let x = 'hello';

    不会存在变量提升的问题,会在console.log那一行报错

    在 let 和 const 建议优先使用const,尤其在全局环境,不应设置变量,只因设置常量。

    为什么const优于let?

    一、const可以提醒阅读程序的人这个变量不应该改变。

    二、const比较符合函数式编程思想,运算不改变值,只是新建值,防止无意间修改变量值所导致的错误,而且这样也有利于将来分布式运算。

    三、JavaScript编译器会对const进行优化。

    多使用const,有利于提高程序的运行效率。

    letconst的本质区别,其实是编译器内部的处理不同。

  • 相关阅读:
    转换流--OutputStreamWriter类与InputStreamReader类
    Android getResources的作用和须要注意点
    sqlit使用要点之引入libsqlite3.dylib
    C语言文件操作之fgets()
    5款伊思儷超媒體繁体游戏 中文简体补丁
    memcpy的使用方法总结
    开发人员改变世界的初心
    expect
    HDU 1061 N^N (n的n次方的最后一位)
    linux杂谈(二十):apache服务配置
  • 原文地址:https://www.cnblogs.com/biubiuxixiya/p/8080948.html
Copyright © 2011-2022 走看看