我是靠谱客的博主 痴情鸵鸟,最近开发中收集的这篇文章主要介绍【深入理解ECMAScript 6】 块级作用域(详细~)ECMAScript 6的概念与块级作用域,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ECMAScript 6的概念与块级作用域

目录

  • ECMAScript 6的概念与块级作用域
    • 一、ES6的概念以及运行环境
      • 1、与JavaScript的关系
      • 2、与ES2015的关系
      • 3、ECMA的发展史
      • 4、开发语言跟JavaScript脚本语言(所有脚本语言)区别
      • 5、Bable是什么
    • 二、块级作用域
      • 1、ES5版本
      • 2、ES6版本
      • 3、let与var的区别
      • 4、let不允许声明提前
      • 5、暂时性死区
      • 6、let不允许重复声明
      • 7、与函数的关系
      • 8、与函数参数的关系
      • 9、为什么需要块级作用域?
      • 10、循环语句与数组
        • 使用`var`:
        • 使用`let`:
    • 三、块级作用域的函数声明

一、ES6的概念以及运行环境

1、与JavaScript的关系

1996年11月,、JavaScript 的创造者Netscape公司,决定将、JavaScript提交给标准化组织
ECMA,希望这种语言能够成为国际标准。次年,ECMIA发布262号标准文件( ECMA- 262 )的
第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是1.0版。
该标准之所以不叫、JavaScript有两个原因,一 是 JavaScript被Netscape公司注册为商标,二是
想体现该标准的制定者是ECMA不是Netscape。

因此,ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现(另外的ECMAScript方言还有、 Jscript和ActionScript )

2、与ES2015的关系

2011年,ECMAScript 5.1版发布后,就开始制定6.0版本。ECMAScript 6就是指该标准的下一
个版本。
标准的制定者想让标准的升级成为常规流程:标准的版本升级成为了一个不断滚动的流程, 每个月都
会有变动。标准委员会最终决定,标准在每年的6月份正式发布一次,作为当年的正式版本。
ECMAScript 6的第一个版本, 就这样在2015年6月发布了,正式名称就是《ECMAScript
2015标准》(简称ES2015)。根据计划,2017年6月发布ES2017标准。

因此,ES6既是一个历史名词,也是一个泛指,含义是5.1版以后的JavaScript的下一代标准,涵盖了ES2015、ES2016、ES2017等等,而ES2015则是正式名称,特指该年发布的正式版本的语言标准

3、ECMA的发展史

ES6从开始制定到最后发布,整整用了15年

  • ECMAScript 1.0是1997年发布的。
  • ECMAScript 2.0发布于1998年6月。
  • ECMAScript 3.0则发布于1999年12月。
  • 2000年ECMAScript 4.0开始酝酿(没有通过),但大部分内容被ES6继承。
  • 2009年12月ECMAScript 5.0版正式发布。
  • 2011年6月ECMAscript 5.1版发布,并且成为ISO国际标准。
  • 2015年6月,ECMAScript 6正式通过,成为国际标准。

4、开发语言跟JavaScript脚本语言(所有脚本语言)区别

在这里插入图片描述

5、Bable是什么

将ES6 转换为ES5

Babel是一个工具链,主要用于在旧的浏览器或环境中将ECMAScript 2015+代码转换为向后兼容版本的 JavaScript代码。以下是Babel可以为你做的主要事情:

  • 转换语法
  • Polyfill 实现目标环境中缺少的功能
  • 源代码转换

安装Bable

//局部安装
cnpm i --save-dev @babel/core @babel/cli @babel/preset-env
cnpm i --save @babel/polyfill

//全局安装
cnpm i -g @babel/core @babel/cli @babel/preset-env
cnpm i -g @babel/polyfill

package.json

{
	"presets":[
		"latest"
	],
	"plugins": [],
	"devDependencies": {
		"babel-cli": "^6.0.0",
		"babel-preset-latest": "^6.24.1"
	},
	"scripts": {
		"build": "babel src -d lib"
	}
}

babel-cli转码

根据package.json配置文件在工程的根目录下创建src和lib 两个目录:

  • src目录:用于放置ECMAScript 6的代码文件。

    转换之前的

  • lib目录:用于放置通过Babel转码后的代码文件。

    转换之后的代码

    在src目录下编写ECMAScript 6的代码文件后,在命令行提示符中通过如下指令进行转码:
    npm run build

二、块级作用域

块级作用域只能使用let关键字,let关键字不仅可以声明块级作用域,还可以用在全局作用域和函数作用域

1、ES5版本

var v = 100
function fn() {
    var w = 10

    console.log(v); //100
    console.log(w);//10
}
fn()
console.log(v);//100
console.log(w);//报错

没有块级作用域

if(true){
	var v = 100
}
console.log(v) //100

2、ES6版本

if(true){
	let v = 100
}
console.log(v) //报错

定义变量使用let该变量只能在当前块级作用域访问

3、let与var的区别

  • let:提供了块级作用域

    也可以在全局作用域和函数作用域中定义变量

  • var:提供了全局作用域跟函数作用域

4、let不允许声明提前

使用var关键字定义变量 : 存在声明提前的现象

console.log(m);//undefined
var m = 100
// 等价于
var m 
console.log(m);//undefined
m = 100//初始化变量

使用let 关键字定义变量时: 不存在声明提前

console.log(v);//报错
let v = 10

5、暂时性死区

ECMAScript 6标准明确规定,如果在一个代码块中使用let或const声明变量或常量时,当前代码块中对这些声明的变量或常量形成了一个封闭的作用域。
在这个代码块中,在使用let或const声明之前,该变量或常量都是不可用的。这种情况,在语法上被称为“暂时性死区”( Temporal Dead Zone, 简称为TDZ)。

let 约等于 暂时性死区

6、let不允许重复声明

// var a = 10
// console.log(a); //10
// var a = 100
// console.log(a); //100

let a = 10
console.log(a);
let a = 100 //报错
console.log(a);

7、与函数的关系

使用var关键字:

var v = 100
function fn() {
    console.log(v);//undefined 因为在这个作用域中,到这行代码v还没有赋值,相当于 在这上面var v;没有赋值,所以是undefined
    var v = 1000
    console.log(v);//1000
}
fn()

使用let关键字后:

// 使用lt声明将当前环境封闭
let v = 100
function fn() {
    // 函数作用域封闭 - 全局作用域的变量跟当前函数作用域的变量无关
    console.log(v);//报错
    let v = 1000
    console.log(v);
}
fn()

看一个例子:

let v = 100
console.log(v);//100
(function () {
    console.log(v);//100
})();

if (true) {
    // 块级作用域
    console.log(v);//100
}
let v = 100
console.log(v);//100
(function () {
	let v;
    console.log(v);//undefined
})();

if (true) {
    // 块级作用域
    console.log(v);//100
}

8、与函数参数的关系

使用var关键字:

function fn(a) {
    var a = 1000
    console.log(a); //100
}
fn(100)
function fn(a) {
    var a 
    console.log(a); //100
    a = 1000
}
fn(100)

使用let关键字:

// 在ES6中函数的参数相当于使用let关键字定义的局部变量
function fn(a) {
    let a =100 //重复声明
    console.log(a); 
    
}
fn(100)

在ES6中函数的参数相当于使用let关键字定义的局部变量

9、为什么需要块级作用域?

使用var

// i是全局变量
for (var i = 0; i < 10; i++){
    console.log(i);// 0~9
}
console.log(i);//10

使用let:

// i是局部变量  块级作用域
for (let i = 0; i < 10; i++){
    console.log(i);// 0~9
}
console.log(i);//报错 i is not defined

10、循环语句与数组

使用var:

var arr = []
for (var i = 0; i < 10; i++){
    arr[i] = i
}
console.log(arr);//[0~9]
console.log(arr[i]);//undefined

经典面试题

var arr = []
for (var i = 0; i < 10; i++){
    arr[i] = function () {
        return i
    }
}
console.log(arr);
/*
[
  [Function], [Function],
  [Function], [Function],
  [Function], [Function],
  [Function], [Function],
  [Function], [Function]
]
*/
console.log(arr[2]());//不管是几 结果都是10

分析图:

在这里插入图片描述

使用let:

var arr = []
for (var i = 0; i < 10; i++){
    arr[i] = function () {
        return i
    }
}
console.log(arr);
/*
[
  [Function], [Function],
  [Function], [Function],
  [Function], [Function],
  [Function], [Function],
  [Function], [Function]
]
*/
console.log(arr[2]());//2  

三、块级作用域的函数声明

使用var:

if (true) {
    //块级作用域
    // function fn() {
    //     console.log('this is function');
    // }
    // 等价于
    var fn = function () {
        console.log('this is function');
    }
}
fn() //this is function

使用let:

if (true) {
    //块级作用域
    
    let fn = function () {
        console.log('this is function');
    }
}
fn() //报错

最后

以上就是痴情鸵鸟为你收集整理的【深入理解ECMAScript 6】 块级作用域(详细~)ECMAScript 6的概念与块级作用域的全部内容,希望文章能够帮你解决【深入理解ECMAScript 6】 块级作用域(详细~)ECMAScript 6的概念与块级作用域所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部