闭包和let块级作用域】的更多相关文章

函数表达式是一种非常有用的技术,使用函数表达式可以无需对函数命名,从而实现动态编程.匿名函数,是一种强大的方式,一下总结了函数表达式的特点: 1.函数表达式不同于函数声明,函数声明要求有名字,但函数表达式不需要,没有名字的叫匿名函数 2.在无法确定如何引用函数的情况下,递归函数就会变得比较复杂 3.递归函数应该始终使用arguments.callee来递归调用自身,不要使用函数名----函数名可能会发生变化 当函数内部定义了其他函数时,就创建了闭包.闭包有权访问包含函数的作用域和全局作用域,原理…
还是先从一个题目开始: 写一个隔1s输出数组的一项的函数. 如果可以用ES6语法,则可以这么写: function print (arr) { for (let i = 0; i < arr.length; i++) { setTimeout(() => { console.log(arr[i]) }, 1000 * i); } } 但是如果把这里的let改成var,则输出就会变成一连串的undefined. 有同学很快想到了这是闭包啊,因为setTimeout把函数加入到microqueue…
function outputNumbers(count) { for (var i=0; i<count; i++) { console.log(i); } var i;  // 重新声明变量 console.log(i);  // 计数 } 上述中,重复声明了i变量,但是JS从来不会告诉你是否多次声明了同一变量:遇到这种情况,它只会对后续的声明视而不见 不过,它会执行后续声明中变量的初始化.匿名变量可以用来模仿块级作用域并避免这个问题. (function() { // 这里是块级作用域(私…
概述 函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则. 但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏变量或函数的需求, 这就是块级作用域的由来. 下面是不用es6实现块级作用域的三种方法, 供以后开发时参考, 相信对其他人也有用. IIFE IIFE, 即立即执行函数, 用一个函数作用域(闭包)来模拟块级作用域.示例如下: //es6中的块级作用域 {let a = 1; console.log(…
  原文:你不知道的js系列 在第(二)节中提到的,标识符在作用域中声明,这些作用域就像是一个容器,一个嵌套一个,这个嵌套关系是在代码编写时定义的. 那么到底是什么产生了一个新的作用域,只有函数能做到吗?JavaScript 的其它代码结构能否创建一个作用域呢? 函数作用域 观察下面的代码: function foo(a) { var b = 2; // some code function bar() { // ... } // more code var c = 3; } 在这段代码中,fo…
ES6新增了 let const 命令,用来声明变量.它的用法类似于 var  ,但是所声明的变量,只在 let const 命令所在的代码块内有效.  var const 不允许重复声明 用处: 可能上一个例子在解释块级作用域封闭空间这一块有点模糊,那么下一个例子会很清晰的阐述这一理念... 循环当中 i 的变化:  如果要解决这个问题让它分别弹出0 .1.2  的话  我们在es5  是这样处理的:  es6  是这样处理的: 分别弹出0.1.2. 总结: 块级作用域,其实就是 匿名函数立即…
avaScript 没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,来看下面的例子: function outputNumbers(count){ for (var i=0; i < count; i++){ alert(i); } alert(i); //计数 } 这个函数中定义了一个for 循环,而变量i 的初始值被设置为0. 在Java.C++等语言中,变量i只会在for 循环的语句块中有定义,循环一旦结束,变量i 就会被销毁.可是在JavaScr…
一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1.  全局作用域: 2.  函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一术语--“变量提升(hoisting)”. 如下: function func(){ console.log(test); var test = 1; }; func(); 在node环境执行上述代码,结果为: 之所以为’undefined’,原因就在于‘变量提升’,在进入func函数时,将所有通过…
在ES6以前,ES不支持块级作用域,只有全局作用域和函数作用域,所有变量的声明都存在变量声明提升. 1.let 关键字 声明一个块级变量,只在一个代码块中有效,如果在块外面访问便会报错,如下所示: { let a = 1; var b = 1; } a;b; ReferenceError: a is not defined //没有定义 let命令非常适合循环语句,如下所示 var a = []; for( let j=0; j<9 ;j++){ a[j] = function(){ conso…
作用域 作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.说到这里我们需要理解两个概念:块级作用域与函数作用域. 函数作用域 这个应该好理解,函数作用域就是说定义在函数中的参数和变量在函数外部是不可见的. 大多数类C语言都拥有块级作用域,JS却没有.请看下文demo: //C语言 #include <stdio.h> void main() { int i=2; i--; if(i) { int j=3; } printf("%d/n",…