说说 ES6 的块级作用域

作者: deniro | 来源:发表于2019-08-03 15:47 被阅读1次

1 问题

先说说没有块级作用域,可能产生的问题。

1.1 内层变量覆盖外层变量

var temp=1;

function f(){
    console.log(temp);
    if(false){
        var temp='字符串变量';
    }
}
f()

运行结果:

undefined

因为变量提升,导致 if 语句体中的变量 temp 覆盖了外层变量 temp。

1.2 用于循环的计数变量,其实是全局变量

var s = 'es6';
for (var i = 0; i < s.length; i++) {
    s[i];
}
console.log('i=' + i);

运行结果:

i=3

2 块级作用域

ES6 通过 let 来实现块级作用域。

function f1() {
    let i = 1;

    if (true) {
        let i = 11;
    }
    console.log(i);
}

f1();

运行结果:

1

外层的变量 i,不受内层变量 i 的影响。

使用 {...} 结构,就可以标注出一个块级作用域。如果一个变量在外层没有定义,那么就会抛出 ReferenceError: xxx is not defined 错误。请看下例:


{
    {
        let str = '你好'
    }
    console.log(str);
}

运行结果:

console.log(str);
^
ReferenceError: str is not defined

内层作用域可以定义与外层作用域同名的变量,而不相互影响:

{
    let str='你好';
    {
        let str = '你好吗';
        console.log('内层:'+str);
    }
    console.log('外层:'+str);
}

运行结果:

内层:你好吗
外层:你好

有了块级作用域,我们就不需要 IIFE(立即调用函数表达式)啦!IIFE 是一个在定义时就会立即执行的 JavaScript 函数。以前没有块级作用域,我们都是使用 IIFE 来模拟块级作用域。

相关文章

  • js 作用域链 和 原型链

    作用域链 js拥有全局作用域(window)、函数作用域、块级作用域(es6)。块级作用域是es6开始才拥有的,因...

  • JS基础知识(2) -- 作用域和作用域链

    作用域 作用域就是变量与函数的可访问范围 全局作用域 函数作用域 ES6块级作用域 ES5没有块级作用域,ES6有...

  • let 和 const

    一、JS中的块级作用域 ES6之前JS不支持块级作用域在ES6之前,JS是没有块级作用域这个概念的,只有全局作用域...

  • js 作用域

    js 作用域主要有:全局作用域和局部作用域,es5之前没有块级作用域,es6有了块级作用域 何为块级作用域,块级作...

  • ES6分享会总结

    学到的内容 ES6的块级作用域 1. 块级作用域的概念 2. ES6允许在块级作用域内声明函数 3. 函数在块级作...

  • 你真的懂let和const吗?

    块级作用域 在ES6之前我们脑海里应该只存在全局作用域和函数级作用域,没有块级作用域。那么为什么要引入块级作用域呢...

  • ES6语法--let和const

    1:let和const:作用域,全局作用域,函数作用域以及块级作用域(es6)。 let声明的变量只在块级作用域内...

  • ES2015(ES6)学习手册

    作用域 全局作用域 函数作用域 块级作用域(es6) let let 声明的变量只在所处的块级有效 let没有变量...

  • 前端(ES6)

    1.块级作用域的引入 在ES6之前,js只有全局作用域和函数作用域,ES6中let关键字为其引入了块级作用域。 l...

  • 块级绑定

    因为ES6之前存在变量提升问题,容易造成问题,ES6引入了块级作用域。 块级声明 块级作用域在函数或者块({})中...

网友评论

    本文标题:说说 ES6 的块级作用域

    本文链接:https://www.haomeiwen.com/subject/fkpjdctx.html