JavaScript ES新特性块级作用域

目录
  • 1.块级作用域是什么
  • 2.为什么需要块级作用域
  • 3.与函数声明

前言:

在学习块级作用域之前需要我们对作用域有个了解,所谓的作用域就是代码当中的某个成员起作用的范围。

1.块级作用域是什么

所谓的块级作用域,就是该变量只能在声明时的代码块或者子代码块中使用。在ECMAScript 2015以前的版本中是不存在块级作用域的,而ECMAScript 2015提供的let关键字,使JavaScript出现了块级作用域,示例代码如下所示

/*
 * 块级作用域只能使用 let 关键字
 * let关键字不仅可以声明块级作用域, 还可以用在全局作用域和函数作用域
 */
// 全局作用域
let a = 100; // 全局变量
(function () {
  // 函数作用域
  let b = 200; // 局部变量
})()
if (true) {
  // 块级作用域
  let c = 300; // 局部变量
}
console.log(a); // 100
console.log(b); // 抛出异常
console.log(c); // 抛出异常

2.为什么需要块级作用域

ECMAScript 5只存在全局作用域和函数作用域,没有块级作用域。这种情况出现一些问题:

局部变量可能会覆盖全局变量

var v = 100;
(function(){
  console.log(v); // undefined
  var v = 200;
})

在循环体中用于计数的变量泄露为全局变量

// 定义一个循环体
for (var v = 0; v < 10; v++) {
  console.log("这是一个 for 循环"); // 这是一个 for 循环 * 10
}
console.log(v); // 10

在循环完毕之后如果不手动释放此变量,其生命周期跟随此脚本生存,占用内存。

3.与函数声明

ECMAScript5标准规定函数的声明只能在全局作用域和函数作用域中,不能再块级作用域中声明。

情况一:

if (true) {
  function f() {}
}

情况二:

try {
  function f() {}
} catch(e) {
  // ...
}

上面两种函数声明,根据ECMAScript5的规定都是非法的。

ECMAScript 2015标准规定在块级作用域声明函数类似于使用了var关键字,即在当前块级作用域外无法访问。

{
  function fun() {
    console.log('this is fun');
  }
}
fun(); // this is fun
// 上面的等同于下面的函数
{
  var fn = function () {
    console.log('this is fn');
  }
}
fn(); // this is fn
// 如果使用 let 关键字 则在块级作用域外无法访问
{
  let f = function () {
    console.log('this is f');
  }
}
f(); // 抛出异常 描述信息为 ReferenceError: f is not defined

到此这篇关于JavaScript ES新特性块级作用域的文章就介绍到这了,更多相关ES新特性块级作用域内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript使用闭包模仿块级作用域操作示例

    本文实例讲述了JavaScript使用闭包模仿块级作用域操作.分享给大家供大家参考,具体如下: 在阅读这篇文章之前,建议先阅读JavaScript的作用域链以及JavaScript闭包. 正如闭包的定义一样:"闭包指的是有权访问另一个函数作用域中的变量的函数", 闭包最大的意义就在于闭包可以对另一个函数作用域的变量进行访问,由此,闭包可以延伸出一系列的用法. 模仿块级作用域 JavaScript没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是包含在函数中而非语句中创建的.从

  • Springboot如何去掉URL后面的jsessionid

    目录 如何去掉URL后面的jsessionid url中有Jsessionid生成的原因 解决方式一 解决方式二 Java关于jsessionid和URL 对SEO的冲击 安全问题 解决之道 如何去掉URL后面的jsessionid url中有Jsessionid生成的原因 jsessionid是标明session的id,它存在于cookie中,一般情况不会出现在url中,服务器会从客户端的cookie中取出来,但是如果客户端禁用了cookie的话,就要重写url了,显式的将jsessionid

  • JavaScript 与 TypeScript之间的联系

    目录 1.什么是 JavaScript? 2.JavaScript 有什么用? 3.什么是 TypeScript? 4.TypeScript 有哪些特点? 5.TypeScript 相对于 JavaScript 的用途是什么? 6.我们应该开始使用 TypeScript 吗? 1.什么是 JavaScript? JavaScript,也称为 JS,是一种符合 ECMAScript 规范的编程语言.这是一个高级别的.通常是即时编译的.多范式的. Vanilla JavaScript 是一个名称,用

  • ES6使用let命令更简单的实现块级作用域实例分析

    本文实例讲述了ES6使用let命令更简单的实现块级作用域.分享给大家供大家参考,具体如下: let 带来了更简单的块级作用域 1. ES6新增了let命令,用于声明变量.其与var的不同在于,用let声明的变量只在 { } 内有效.这使得我们可以很方便的实现块级作用域,不再使用立即实行函数. { let a=1; var b=2; } console.log(a); //undefined console.log(b); //2 在for循环中使用let可以有效避免全局变量污染. 2. let不

  • ES6学习教程之块级作用域详解

    前言 众所周知ES5之前javascript语言只有函数作用域和全局作用域,使用var来声明变量,var声明的变量还存在变量提升使人困惑不已.我们先来复习一下ES5的var声明,再对比学习let和const . var var声明之函数作用域和全局作用域. 来段代码体会一下: function getName() { if (1 + 1 === 2) { var name = 'xixi'; } console.log(name); } getName();//xixi 在c或java语言中na

  • 深入理解ES6学习笔记之块级作用域绑定

    众所周知,js中的var声明存在变量提升机制,因此ESMAScript 6引用了块级作用域来强化对变量生命周期的控制 let const 声明不会被提升,有几个需要注意的点 1.不能被重复声明 假设作用域中已经存在某个标识符(无论该标识符是通过var声明还是let.const变量声明),此时再使用let或const关键定声明会抛错 var count=10 let count=20// 此处则会抛出错误,因为同一作用域内不能重复声明 如果当前作用域内嵌另一个作用域,便可在内嵌的作用域中用let声

  • JS块级作用域和私有变量实例分析

    本文实例讲述了JS块级作用域和私有变量.分享给大家供大家参考,具体如下: 块级作用域 (function(){ //这里是块级作用域 })() 例如: (function(){ for(var i=0;i<5;i++){ alert(i);//0,1,2,3,4 } })(); alert(i);//error 上例中,定义了一个块级作用域,变量i在块级作用域中可见的,但是在块级作用域外部则无法访问. 这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数. 私有变

  • 深入理解es6块级作用域的使用

    一.var 声明与变量提升机制 在JavaScript中使用var定义一个变量,无论是定义在全局作用域函数函数的局部作用域中,都会被提升到其作用域的顶部,这也是JavaScript定义变量的一个令人困惑的地方.由于es5没有像其它类C语言一样的块级作用域,因此es6增加了let定义变量,用来创建块级作用域. 我们来看一个var定义变量的示例: function setName(){ if(condition){ var name = 'loho'; console.log(name); }els

  • JavaScript中的useRef 和 useState介绍

    目录 1.useState hook 2.useRef hook 3.useRef 与 useState 4.何时使用 Refs 和 States 1.useState hook useState 是一个内置的 React hook,它允许您将信息作为状态存储在变量中.它允许您将 React 状态添加到功能组件.在下面的示例中,useState()声明状态变量,而值存储在计数变量中.setCount是用于更新此值的函数. //从 react 导入 useState import React, {

  • 详解JavaScript es6的新增数组方法

    目录 1. forEach() 2. arr.filter() 3. arr.every() 4. arr.map() 5. arr.some() 总结 1. forEach() 遍历数组,无return 即使有return,也不会返回任何值,并且会影响原来的数组 callback的参数 value --当前索引的值 index --索引 arr --原数组 let arr = ["a", "b", "c", 1, 2, 3]; arr.forE

随机推荐