varlet和const
Posted dropInInt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了varlet和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
以上是关于varlet和const的主要内容,如果未能解决你的问题,请参考以下文章