let块级作用域

let是es6中新加的作用域,即块级作用域。

var申明的变量要么全局,要么函数级,而let允许把变量的作用域限制在块级域中,这里的块级可以是()内,或{}内。

示例:

code_1:

1 "use strict";
2 var a = [];
3 for(let i=0; i<10; i++){
4     a[i] = function(){
5         console.log(i);
6     }
7 }
8 a[6]();//结果为6

code_2:

1 var a = [];
2 for(var i=0; i<10; i++){
3     a[i] = function(){
4         console.log(i);
5     }
6 }
7 a[6]();//结果为10

code_3:

1 var a = [];
2 for (var i = 0; i < 10; i++)
3     (function(c) {
4         a[i] = function() {
5             console.log(c);
6         }
7     }(i));
8 a[6]();//结果为6

先来说说code_1和code_2,最开始接触到let作用域时,就看到这个例子,尽管当时也看了别人写的一些文章,但感觉一直没有弄懂,看着这两段代码挺简单的,但就是想不明白为什么code_1的结果是6,code_2的结果是10(自己还是太菜了(ー?ー|||)),今天看redux时,决定从头把一些基础知识进行梳理一遍,然后又接触到let,就想到这两段代码,想了很久,还是没明白(ー?ー|||),于是问同事,同事给了我一个提示,最终算是真正理解了,至少这个结果能够解释得通了(觉得自己废话好多)。

言归正传,在code_2中,由var定义的变量 i 是一个全局变量,每次循环的时候 i 都会被覆盖,而for循环体内的a[i]只是定义了一个函数,函数内部的打印的 i 在使用前还是一个变量,并不是固定的值,循环结束,全局变量 i = 10,所以最后调用a[6]()时打印的结果为10。在code_1中,由let定义的变量 i 在块级作用域内,每次循环时,a[i]函数中的 i 不会再改变,所以循环结束后打印的结果为6。code_3涉及到函数闭包,在网上看到了,就贴一下。

参考:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let

https://segmentfault.com/q/1010000002466776

时间: 2024-10-29 14:35:00

let块级作用域的相关文章

ES6之块级作用域

一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1.  全局作用域: 2.  函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一术语--“变量提升(hoisting)”. 如下: function func(){ console.log(test); var test = 1; }; func(); 在node环境执行上述代码,结果为: 之所以为’undefined’,原因就在于‘变量提升’,在进入func函数时,将所有通过

模仿块级作用域

在JavaScript中没有块级作用域的概念.这就意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的. <script> for(var i=0;i<5;i++) { } alert(i); </script> 就上面这个例子中,可以弹出i是5,因为for语句事实上是包含在window.onload= function(){}这个函数中,alert也在这个函数中. 而在java.c++中i只会在for循环的语句块中定义,循环一但结束,变量i就会被销毁.而在Jav

垃圾收集、块级作用域

javascript是一门具有自动垃圾收集机制的编程语言,开发人员不必前内存分配的回收的问题. 离开作用域的值将被自动标记为可以回收,因此将来在垃圾收集期间被删除.标记清除是目前主流的垃圾回收算法,这种算法思想是给当前的值加上标记,然后回收其内存. javascript里没有块级作用域的概念,和c,java等高级语言不同所以在使用if,for格外小心 for(var i=0;i<3;i++) { alert(i); } alert(i);//打印出4

关于JavaScript中没有块级作用域的理解

引用<JavaScript权威指南>(第六版)中的举例 代码段1: var scope="global"; function f(){ console.log(scope); scope="local" console.log(scope); } f(); 会输出什么? 答案:undefined  global 代码段2: var scope="global"; function f(){ var scope; console.log

关于Javascript没有块级作用域和变量声明提升

Javascript是没有块级作用域的,在语句块中声明的变量将成为语句块所在代码片段的局部变量.例如: 1 if(true){ 2 var x=3; 3 } 4 console.log(x); 结果输出3. 再如: 1 var x=5; 2 3 function a(){ 4 if(!x){ 5 var x=10; 6 } 7 console.log(x); 8 } 9 a(); 结果是10.因为变量声明的提升,原理是这样的,举个例子: 1 if(a==undefined){ 2 alert("

匿名函数模仿块级作用域

问题 [无块级作用域]JavaScript中没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的. function outputNumbers(count){ for(var i = 0; i < count; i++){ alert(i); } console.log(i); } outputNumbers(2);//弹出0,1输出2 //变量i是定义在outputNumbers()的活动对象中的,因此从它有定义开始,就可以在函数内部随时访问它. 函数中的

block、块级作用域

block:语句块 (或其他语言中的 复合语句) 用来组织零个或多条语句. 包含在{ }里面 通常在流程控制语句 (如 if, for, while)中使用 块级作用域:通过var声明的变量没有块级作用域. 在语句块(block)里声明的变量作用域是其所在的函数或者 script 标签内, 你可以在语句块外面访问到它. 换句话说, 语句块不会生成一个新的作用域. 尽管单独的语句块是合法的语句, 但在JavaScript中你不会想使用单独的语句块,因为它们不像你想象的C或Java中的语句块那样处理

JavaScript的作用;JS常见的三种对话框;==和===的区别;函数内部参数数组arguments在函数内部打印实参;JS的误区:没有块级作用域

JS:客户端(浏览器)脚本语言 弱类型 基于原型 事件驱动 不需要编译(直接运行) JS的作用:表单验证,减轻服务端的压力 添加页面动画效果  动态更改页面内容  Ajax网络请求 (一)常见的对话框 alert()对话框:该方法是window对象的方法,在浏览器中弹出一个对话框(该方法没有返回值)  prompt()对话框:2个参数,一个是浏览器提示信息,第二个是默认的输入框的值,返回值就是输入框的信息  confirm()对话框:在浏览器弹出一个对话框,用户只能选择正确或者取消,返回值对应为

js没有块级作用域

今天看一篇介绍ECMAscript6的博文时,看到let命令的时候突然有点蒙逼....... let命令:let用于变量声明,与var用法类似,但是let是一个局部变量,只在声明的代码块中有效. { let a = 10; var b = 20; } a // not defined b // 20 看到这我觉得这个块级作用域是函数作用域,但是块级作用域和函数作用域是不一样的,比如: function demo(){ var a=1; } console.log(a); a//not defin

javascript模仿块级作用域

作用域有词法作用域和块级作用域之分,javascript属于词法作用域,而在java.C++中却是块级作用域.在javascript中,只有函数能够创建作用域,作用域是以function作为边界的. 先看一段代码: function outPut(){ for(i=0;i<5;i++) { console.log(i);//0,1,2,3,4 第一个i } console.log(i);//5 第二个i }; 解释:在java等语言中,for循环这块代码中的i变量将会被销毁,第二个i打印出来就是