标签:declare blog 完全 代码块 col function efi 报错 控制
1.let
基本用法:let声明的变量,只在let
命令所在的代码块内有效
{ let a = 1; var b = 2; } console.log(a) //a is not defined console.log(b) //2
for(let i=0;i<5;i++){ //.... } console.log(i) //i is not defined
for循环内的var和let声明
for(var i=0;i<5;i++){ //.... } console.log(i) //5
var声明会产生一个全局变量i,循环结束后i=5
for(let i=0;i<5;i++){ //.... } console.log(i) //i is not defined
let声明的变量i,只在本轮循环中有效,相当于每次循环都会重新声明新的变量i,且只在声明的块作用域内有效
不存在变量提升
console.log(a); //undefined var a = "hello"; console.log(b); //报错:b is not defined let b = "Hello"
let声明的变量不能在声明之前使用
暂时性死区:只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tem = "hello"; if(true){ tem = "Hello" //ReferenceError: tem is not defined let tem; }
在代码块内,使用let
命令声明变量之前,该变量都是不可用的
不允许重复声明
if (true) { var a = "hello"; let a = "Hello"; //SyntaxError: Identifier ‘a‘ has already been declared let b = "sayhi"; let b = "sayHi"; //SyntaxError: Identifier ‘b‘ has already been declared }
块级作用域
function test(){ let n = 5; if(true){ let n = 10; } console.log(n) //5 } test()
let声明的变量只在当前块作用域内有效,故输出5而非10
2.const
const
的作用域与let
命令相同:只在声明所在的块级作用域内有效。
const PI = 3.1415; console.log(PI); //3.1415 PI = 3; //TypeError: Assignment to constant variable.
const PI; //SyntaxError: Missing initializer in const declaration PI = 3;
const
实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const
只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
const PI = 3.1415; PI = 3; //TypeError: Assignment to constant variable. const arr = []; arr.push("hello"); console.log(arr) //[ ‘hello‘ ] const obj = {}; obj.sayhi = "Hi!" console.log(obj) //{ sayhi: ‘Hi!‘ }
标签:declare blog 完全 代码块 col function efi 报错 控制
原文地址:http://www.cnblogs.com/sghy/p/7735760.html