第1章 var let const

let, const, var

javascript在ES6之前是没有块级作用域的概念的,ES6引**let**,**const**关键字引入块级作用域,也称为lexical scope.

下面谈一谈let,const与var的差别。

1.在同一作用域,let,const声明之后不能重复声明

var a = 10;
var a = 20; // ok

 let b = 10;
let b = 20; // error "b"已经声明了
b = 24;     // ok

const c = 10;
const c = 14; // error "c"已经声明
c = 24;       // error 不能对constant变量在同一作用域重复声明
{
    const c = 34; // ok
}

2.变量提升(Hoisting)

**var** 经常引起问题的原因就是变量提升,因为ES5没有块级作用域的概念,let,const很好的解决了这个问题。

比如:

function getValue(isSomething) {
    // value exists here
    if (isSomething) {
        var value = 34;
        return value;
    } else {
        return null;
    }
    // value exists here 
}

等同于:

function getValue(isSomething) {
    var value; // 变量提升hoisting
    if (isSomething) {
        value = 34; // 在此处赋值
        return value;
    } else {
        return null;
    }
    // value exists here 
}

let,const在为声明之前是不能使用的,在同一作用域内,会出现TDZ(暂时死区),比如:

function someFunc() {
    console.log(typeof value); // error, value未定义,TDZ
    let value = 12;
}

3.var,let,const 在for循环中

var:

for (var i = 0; i < 10; i++) {
    // ...
}
console.log(i); //  10 ,i在外面仍然可以访问,变量提升

let:

for (let i = 0; i < 10; i++) {
    // ...
}
console.log(i); // error, i未定义

const:

for (const i = 0; i < 10; i++) { // error, constant 不能改变
    // ...
}
console.log(i); // error, i未定义

4.在函数循环中,闭包问题

var:

var funcs = [];
for (var i = 0; i < 10; i++) {
    funcs.push(function() {
        console.log(i);
    });
}
funcs.forEach(function(func) {
    func(); // 输出10次“10”
})
// 因为函数内部i引用外部i,形成闭包,引用的对象都为i,最后i=10,所以函数中i全部变为10

// 可以使用IIEF让每次i都返回

var funcs = [];
for (var i = 0; i < 10; i++) {
    funcs.push((function(value){
        return function() {
                console.log(value);
        }
    })(i));
}
funcs.forEach(function(func) {
    func(); // 输出 0123456789
})

let:

var funcs = [];
for (let i = 0; i < 10; i++) {
    funcs.push(function() {
        console.log(i);
    });
}
funcs.forEach(function(func) {
    func(); // 输出 0123456789
})

5.let,const在for...in.., for...of...中

对于for...in, for...of 对对象属性进行遍历,var会出项变量提升的问题,const在for...in,for...of中,变量不能改变

var funcs = [];
var obj = {
    a: true,
    b: true    
}
for (let key in obj) {
    funcs.push(function() {
        console.log(key);
    });
}
funcs.forEach(function(func) {
    func(); // "a", "b", "c"
});

6.在全局作用域下声明,let,const在全局作用域下,但是不会成为全局对象的属性

// 全局作用域
var RegExp = "hello"; // 修改了native对象
"RegExp" in window; // true
window.RegExp === RegExp // true

let RegExp = "HELLO";
"RegExp" in window; // false,没有修改原生对象,只是遮盖了原生对象
window.RegExp === RegExp // false

7.总结

  1. let,const不会产生变量提升,只存在其所声明的块状作用域,未声明前不能使用;
  2. let,const在for每次循环都会绑定一个新的值,这点和var区别要注意;
  3. 在全局作用域下的赋值,let,const不是直接添加到全局对象,称为全局对象的属性;
  4. let一般都能替代var,并且产生的效果和预期一样,const表示常量。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容