zoukankan      html  css  js  c++  java
  • var、let和const

    var
    1.var作用域
    使用 var 操作符定义的变量会成为包含它的函数的局部变量.比如,使用 var在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁:
    function test() { 
     var message = "hi"; // 局部变量
    } 
    test(); 
    console.log(message); // 出错!
    在函数内定义变量时省略 var 操作符,可以创建一个全局变量
    function test() { 
     message = "hi"; // 全局变量
    } 
    test(); 
    console.log(message); // "hi"

    tip:虽然可以通过省略 var 操作符定义全局变量,但不推荐这么做。在局部作用域中定义的全局变量很难维护,也会造成困惑。这是因为不能一下子断定省略 var 是不是有意而为之。在严格模式下,如果像这样给未声明的变量赋值,则会导致抛出 ReferenceError

    如果需要定义多个变量,可以在一条语句中用逗号分隔每个变量(及可选的初始化):
    var message = "hi", 
     found = false, 
     age = 29;

    2.使用 var 时,下面的代码不会报错。这是因为使用这个关键字声明的变量会自动提升到函数作用域顶部

    function foo() { 
     console.log(age); 
     var age = 26; 
    } 
    foo(); // undefined
    反复多次使用 var 声明同一个变量也没有问题
    function foo() { 
     var age = 16; 
     var age = 26; 
     var age = 36; 
     console.log(age); 
    } 
    foo(); // 36

    let

     let 声明的范围是块作用域,而 var 声明的范围是函数作用域
    if (true) { 
     var name = 'Matt'; 
     console.log(name); // Matt 
    } 
    console.log(name); // Matt
    if (true) { 
     let age = 26; 
     console.log(age); // 26 
    } 
    console.log(age); // ReferenceError: age 没有定义
    let 不允许同一个块作用域中出现冗余声明
    let age; 
    let age; // SyntaxError;标识符 age 已经声明过了
    JavaScript 引擎会记录用于变量声明的标识符及其所在的块作用域,因此嵌套使用相同的标识符不会报错
    let age = 30; 
    console.log(age); // 30 
    if (true) { 
     let age = 26; 
     console.log(age); // 26 
    }
    对声明冗余报错不会因混用 let 和 var 而受影响
    var name; 
    let name; // SyntaxError 
    let age; var age; // SyntaxError
    let 声明的变量不会在作用域中被提升
    // name 会被提升
    console.log(name); // undefined 
    var name = 'Matt'; 
    
    // age 不会被提升
    console.log(age); // ReferenceError:age 没有定义
    let age = 26;
    let 在全局作用域中声明的变量不会成为 window对象的属性(var 声明的变量则会)。
    var name = 'Matt'; 
    console.log(window.name); // 'Matt' 
    
    let age = 26; 
    console.log(window.age); // undefined
    使用 let 之后,for 循环定义的迭代变量不会渗透到循环体外部
    for (var i = 0; i < 5; ++i) { 
     // 循环逻辑 
    } 
    console.log(i); // 5
    for (let i = 0; i < 5; ++i) { 
     // 循环逻辑
    } 
    console.log(i); // ReferenceError: i 没有定义
    for (var i = 0; i < 5; ++i) { 
     setTimeout(() => console.log(i), 0) 
    } 
    // 5、5、5、5、5 
    for (let i = 0; i < 5; ++i) { 
     setTimeout(() => console.log(i), 0) 
    } 
    // 会输出 0、1、2、3、4
    const
    const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改 const 声明的变量会导致运行时错误。
    const age = 26; 
    age = 36; // TypeError: 给常量赋值
    // const 也不允许重复声明
    const name = 'Matt'; 
    const name = 'Nicholas'; // SyntaxError
    // const 声明的作用域也是块
    const name = 'Matt'; 
    if (true) { 
     const name = 'Nicholas'; 
    } 
    console.log(name); // Matt
    const 声明的限制只适用于它指向的变量的引用,如果声明的是一个对象,则可以修改
    const person = {}; 
    person.name = 'Matt'; // ok
  • 相关阅读:
    lamp架构之一键编译安装lamp搭建wordpress和discuz脚本(基于centos)
    更换公网IP导致wordpress网站无法正常访问解决方法
    centos7一键编译安装Apache2.4.46脚本
    redis之RDB备份脚本
    一键编译安装redis5.0.9脚本(centos)
    一键二进制安装mysql8.0.19脚本(shell)
    c语言 扫雷游戏(才做了三分之一)
    C语言 数据结构单链表(未解决版)
    JAVA final关键字的使用
    JAVA 520 无限循环I love you
  • 原文地址:https://www.cnblogs.com/dropInInt/p/14873471.html
Copyright © 2011-2022 走看看