块级作用域问题ES5 & ES6

Posted oy-lee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了块级作用域问题ES5 & ES6相关的知识,希望对你有一定的参考价值。

1.  没有块级作用域

在其他类C语言中,由花括号封闭的代码块都有自己的作用域(如果用ECMAScript的话来说,就是它们自己的执行环境),

所以支持根据条件来定义变量。

 

ES5:

if(true){
    var color = ‘blue‘;
}

console.log(color); //‘blue‘

这里是在一个if语句中定义了变量color。如果是在C、C++或Java中,color会在if语句执

行完毕后被销毁。但在javascript中,if语句中的变量声明会将变量添加到当前的执行环境(在这里是

全局环境)中。在使用for语句时,尤其要牢记这一差异,例如:

for(var i=0; i < 10; i++){ 
    doSomething(i);
} 

console.log(i); //10

 

2.  使用var声明的变量会自动被添加到最近的执行环境中。

// ‘use strict‘;

var a2 = ‘Hera‘;

function aaa(){

    var a2 = ‘Apollo‘;  //aaa函数作用域的a2,不会影响到全局作用域的a2,注意区分

    function bbb(){
        a2 = ‘Diana‘;  //由于闭包,访问的是调用aaa函数之后产生的局部函数执行环境中的a2变量。

        a1 = ‘Medusa‘; //没有使用var声明,当bbb函数调用之后,a1会被添加到全局环境。
    }

    bbb();
    
    console.log(a2);

}

aaa();

console.log(a2); //全局环境声明的 a2 ‘Hera‘

console.log(a1); //bbb函数被调用后,被添加到全局环境的a1变量
                 //严格模式时,在调用bbb时,a1 = ‘Medusa‘这一行就会报错a1 is not defined

 

3.查询标识符

在上一步中,bbb函数中a2 = ‘Diana‘ ,就是一个查询标识符的过程。a2没有使用var声明,向上一级aaa函数的作用域开始查询,

查询到了var a2  = ‘Apollo‘之后,再赋值,那么这个时候,aaa作用域的a2已然变成了 ‘Diana’。

以上是关于块级作用域问题ES5 & ES6的主要内容,如果未能解决你的问题,请参考以下文章

块内声明函数

什么是快级作用域,es6中如何实现块级作用域

Es5.Es6区别

ES6与ES5差别

es6 转载

ES6 学习笔记