es6中添加块级作用域的目的
原本只有函数作用域和全局作用域两种,这就导致出现很多不方便的地方:
1)for循环问题:在看js高程的时候,纠结在第七章好久,就是一个这样的实例
function createFunctions(){
var result = new Array();
for (var i = 0 ; i < 10 ; i ++){
result[i] = function (){
return i;
}
}
return result;
}
不管这段代码输出result[i]()中的i是几,结果都是10,这就是没有块级作用域的一个弊端。因为变量i是全局变量,每次循环都是对同一个i变量进行操作,导致覆盖,所以最后无论对result数组中的哪个函数进行执行,结果都是输出10;
2)内外成变量的覆盖问题
var a = 10;
function f(){
console.log(a);
var a = 20;
}
执行结果是undefined,这是因为内层变量a对外层同名变量覆盖了,上述代码由于声明被提升,相当于下面这样写:
var a = 10;
function f(){
var a;
console.log(a);
a = 20;
}
由于内层函数作用域的存在,新声明的a是undefined,会被输出。
考虑到上述两种问题,加入了块级作用域,比如将for循环中的var i 改为let i,就会输出预期的结果;第二个例子中涉及到let和块级作用域绑定,存在暂时死区问题,若只将内层var换成let,会出现referenceError错误,即let声明不同于var,声明前不可获取,所以出错。若感兴趣,可再自行查阅。
es6中添加块级作用域的目的的更多相关文章
- js中的块级作用域
概述 函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则. 但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏 ...
- 12.24 ES6浅谈--块级作用域,let
第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前. 1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区 ...
- javascript中模仿块级作用域
学过 javascript 的都知道 javascript 里面没有块级作用域的概念,这就意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,看下面的例子: function outPu ...
- ES6 - Note1:块级作用域与常量
在ES6以前,ES不支持块级作用域,只有全局作用域和函数作用域,所有变量的声明都存在变量声明提升. 1.let 关键字 声明一个块级变量,只在一个代码块中有效,如果在块外面访问便会报错,如下所示: { ...
- Javascript中没有块级作用域(模仿)
在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域).而在javascript中则没有块级作用域,首先来看一段代码: function test(){ for(var ...
- 深入理解ES6之《块级作用域绑定》
众所周知,js中的var声明存在变量提升机制,因此ESMAScript 6引用了块级作用域来强化对变量生命周期的控制let const 声明不会被提升,有几个需要注意的点1.不能被重复声明 假设作用域 ...
- 《深入理解ES6》笔记——块级作用域绑定(1)
本章涉及3个知识点,var.let.const,现在让我们了解3个关键字的特性和使用方法. var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方 ...
- 一个经典的js中关于块级作用域和声明提升的问题
function functions(flag) { if (flag) { function getValue() { return 'a'; } } else { function getValu ...
- JS中的块级作用域,var、let、const三者的区别
1. 块作用域{ } <script type="text/javascript"> { var a = 1; console.log(a); // 1 } conso ...
随机推荐
- Window 对象详解 转自 http://blog.csdn.net/jcx5083761/article/details/41243697
详解HTML中的window对象和document对象 标签: HTMLwindowdocument 2014-11-18 11:03 5884人阅读 评论(0) 收藏 举报 分类: HTML& ...
- C语言隐形密码输入
今天费了老大的劲,终于做出来了!虽然简单,但也是自己的心血,分享一下! #include<stdio.h> #include<conio.h> int main(){ char ...
- CVPR 2007 Learning to detect a salient object
Dataset: MSRA A&B are introduced in this paper. A conditional Random Field based method was prop ...
- js面向对象笔记
JavaScript 私有成员实现 到此为止,如果您任然对 JavaScript 面向对象持怀疑态度,那么这个怀疑一定是,JavaScript 没有实现面向对象中的信息隐藏,即私有和公有.与其他类式面 ...
- [Qt系列] 何处下载,如何安装!
时间:2016.07.29 -------------------------------------------- 其实方法有很多! 我的思路是想独立使用它,不想联合VS. 下载地址:http:// ...
- Delphi 获取临时数据集 ClientDataSet
function GetcdsAccountsData: OleVariant; var ASQLQuery: TSQLQuery; Adsp: TProvider; begin ASQLQuery: ...
- 文本换行word-wrap、word-break与white-space
本文同步至微信公众号:http://mp.weixin.qq.com/s?__biz=MzAxMzgwNDU3Mg==&mid=401671055&idx=1&sn=b88c9 ...
- vc++ 程序开机自启动和取消启动
//开机启动 int CMainWnd::CreateRun() { //添加以下代码 HKEY hKey; }; //得到程序自身的全路径 DWORD dwRet = GetModuleFileNa ...
- javascript之Dorm
一.document.getElementById() 根据Id获取元素节点: <div id="div1"> <p id="p1"&g ...
- mybatis, spring, springmvc
mybatis配置: mybatis-config.xml <configuration> <!-- 作者MyBatis博客: http://legend2011.blog.51ct ...