var和let的区别(详解)
2017-06-26 20:34
405 查看
1. 作用域
通过
通过
浏览器在运行代码之前会进行预解析,首先解析函数声明,定义变量,解析完之后再对函数、变量进行运行、赋值等。
那么
4.
此时打印出的结果为0 1 2 3 4 ,
而如果换成
通过
var定义的变量,作用域是整个封闭函数,是全域的 。
通过
let定义的变量,作用域是在块级或是子块中。
function varTest() { var x = 1; if (true) { var x = 2; // 同样的变量! console.log(x); // 2 } console.log(x); // 2 } function letTest() { let x = 1; if (true) { let x = 2; // 不同的变量 console.log(x); // 2 } console.log(x); // 1 }
2. 不可以在当前作用域重复声明同一个变量
在同一个函数或同一个作用域中用let重复定义一个变量将引起 TypeError
function letTest() { let x = 1; let x = 2; console.log(x); } letTest() // 报错
3. 变量提升
var声明的变量由于存在变量提升(hoist),不论
var声明的变量处于当前作用域的第几行,都会提升到作用域的头部。
var a = 1; function foo(){ alert( a ); // undefined var a = 2; } foo();
浏览器在运行代码之前会进行预解析,首先解析函数声明,定义变量,解析完之后再对函数、变量进行运行、赋值等。
那么
let存在变量提升么?
let是存在变量提升的,在JavaScript中,所有的声明(
var、
function、
let、
const、
class、
function\*)都会存在变量提升,
var声明的变量与
let声明的变量区别在于初始化值的不同。
x = y = "global"; (function() { x; // undefined y; // Reference error: y is not defined var x = "local"; let y = "local"; }());
var声明的变量会被提升到作用域的顶部并初始化为
undefined,而
let声明的变量在作用域的顶部未被初始化,直到
let声明的语句被赋值,因此当使用这个值的时候会导致一个
reference error的错误,在
let声明变量之前被称为
temporal dead zone,即临时死亡区。
4. let
与for
循环配合
for(let i = 0; i < 5 ; i++ ){ setTimeout(function(){ console.log(i) // 0 1 2 3 4 },1000) }
此时打印出的结果为0 1 2 3 4 ,
let与
for循环使用时,其作用域是
(let i = 0; i < 5 ; i++ ),但是ECMAScript规定,会在{}块级作用域中定义一个
let j临时变量与
(let i = 0; i < 5 ; i++ )中的
i相等,因此
setTimeout中的
i指向不同的
i。
for(var i = 0; i < 5 ; i++ ){ setTimeout(function(){ console.log(i) // 5次5 },1000) }
而如果换成
var之后, 由于
i是函数级变量,5个内部函数都指向了同一个
i,而
i最后一次赋值是5,因此打印出是5个5。
相关文章推荐
- swift中let 和var的区别
- swift 初步接触 基本语法 方法命名 !和?区别 as!和as?区别 let和var区别 extension override private (一)
- JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
- js中const,var,let区别
- JS中const、let、var之间的区别
- ios8 swift开发:let var 区别讨论
- ECMAScript中let与var的区别
- js中const,var,let区别
- js中let和var定义变量的区别
- var、let、const区别
- js中let和var定义变量的区别
- ES6 中的let、const与var的区别
- var 与 let 的区别
- js变量中有var定义和无var定义的区别,es6中let命令和const命令
- javascript中var let const三种变量声明方式详解
- Dynamic和Var的区别及dynamic使用详解
- JavaScript中const、var和let区别浅析
- ES6 let、var、const联系与区别
- JavaScript中const,var,let的区别
- ECMAScript中let与var的区别