《你不知道的js(上卷)》作用域闭包(代码片段)

lalal lalal     2022-12-26     343

关键词:

五、作用域闭包:

? 闭包不是神奇的魔法,它只是遵循我们前几章一直介绍的 词法作用域书写代码的自然结果。

? 闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量。

一)、回调函数与闭包:

  • 回调函数,将一个函数的引用作为参数传递给另一个函数。
function wait(meesage) 
	setTimeout(function timer() 
		console.log(meesage);
	, 1000);

wait("Hello, closure!")

? 无论何时何地,如果将函数(访问他们各自的词法作用域)当作第一级的值类型并到处传递,就可以看到闭包的存在。在定时器、事件监听器、Ajax请求、跨窗口通信等异步或同步任务中,只要使用了回调函数,实际上就是在使用闭包。

二)、循环与闭包:

// 使用var
for (var i = 1; i <= 5; i++) 
	setTimeout(function timer() 
		console.log(i);
	, i * 1000)
 // 6 6 6 6 6 

// 使用let
for (let i = 1; i <= 5; i++) 
	setTimeout(function timer() 
		console.log(i);
	, i * 1000)
 // 1 2 3 4 5

? 比较上面两段代码与输出结果。发现使用var在循环中声明变量不能达到我们想要的效果。这是因为尽管每次循环都定义了一个新的函数,但是对于这些函数,是共享同一个作用域的,因此i也是相同的。而使用let,会在每次迭代时都创建一个新的作用域。并且使用let会让i这个变量在每次迭代都会声明,且会使用上一个迭代结束时的值来初始化这个变量。

三)、模块模式:

? 在许多面向对象语言(如Java)中,都支持将方法声明为私有,即只能被同一个类中的方法调用。在JavaScript中并没有这种原生支持。我们可以使用闭包来模拟私有方法,这种方式也被称作 模块模式

? 这种方式不仅有利于限制对代码的访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱代码的公共接口部分。

var foo = (function CoolModule() 
  var something = "cool";
  var another = [1, 2, 3];

  function doSomething() 
    console.log(something);
  

  function doAnother() 
    console.log(another.join("!"));
  

  return 
    doSomething: doSomething,
    doAnother: doAnother
  

)();

foo.doSomething(); // cool
foo.doAnother(); // 1!2!3

ES6中的模块机制:

? ES6中为模块增加了一级语法支持。但通过模块系统进行加载时,ES
6会将文件当作独立的模块来处理。每个模块都可以导入其他模块或特定的API成员,同样也可以到处自己的API成员。

  • import可以将一个模块中的一个或多个API导入到当前作用域中,并分别绑定在一个变量上。
  • module会将整个模块的API导入并绑定到一个变量上。
  • export会将当前模块的一个标识符(变量、函数)导出为公共API。

四)、小结:

  • 闭包虽然随处可见,但是不要滥用。使用闭包在处理速度和内存消耗方面对脚本性能具有负面影响。
  • 理解闭包的关键还是前几章讲述的词法作用域,因此不能跳过前几章!

你不知道的javascript--上卷--读书笔记2

闭包是什么?  答:当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。通俗地来说:函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的任... 查看详情

你不知道的javascript(上卷)

第一部分作用域和闭包第1章作用域是什么  1.1编译原理  1.2理解作用域    1.2.1演员表    1.2.2对话    1.2.3编译器有话说    1.2.4引擎和作用域的对话    1.2.5小测验  1.3作用域嵌套  1.4异常  1... 查看详情

你不知道的javascript上卷-读书笔记-第2章词法作用域-2.2欺骗词法(代码片段)

你不知道的JavaScript上卷-读书笔记-第2章词法作用域-2.2欺骗词法作用域`eval`和`with`的缺点作用域JavaScript在ES6以前只有函数作用域。ES6开始支持块作用域:通常就是包裹的范围作用域中查找变量or函数的规则是从当前向... 查看详情

你不知道的javascript上卷-读书笔记-第2章词法作用域-2.2欺骗词法(代码片段)

你不知道的JavaScript上卷-读书笔记-第2章词法作用域-2.2欺骗词法作用域`eval`和`with`的缺点作用域JavaScript在ES6以前只有函数作用域。ES6开始支持块作用域:通常就是包裹的范围作用域中查找变量or函数的规则是从当前向... 查看详情

你不知道的javascript-上卷の读书笔记

本书主要从两个部分来进行阐述:作用域与闭包、this与对象原型。         一 作用域与闭包          1— 作用域对JavaScript而言,大部分情况下编译... 查看详情

你不知道的js(代码片段)

1、作用域 块级作用域let只在函数内部自己的作用域内有效 全局作用域var 函数作用域 找不到作用域抛出ReferenceError变量有了则抛出TypeError 先声明后赋值 函数提升变量提升函数优先,函数声明提升在普通变量之前 函数表达... 查看详情

你不知道的js系列(13)-什么是闭包(代码片段)

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行functionfoo()  vara=2;  functionbar()    console.log(a);    returnbarvarbaz=foo();baz();//2——朋友,这就是闭包的效果在foo... 查看详情

js你不知道的javascript笔记——作用域与闭包-编译原理-lhs-rhs-循环与闭包-模块-词法作用域-动态作用域(代码片段)

文章目录1.什么是作用域1.1编译原理1.2JS编译原理①引擎怎么查找变量②LHS与RHS的练习③BB几句1.3作用域链1.4RHS与LHS找不到的情况1.5总结2.JS作用域2.1词法作用域2.2函数作用域关于函数声明与函数表达式立即执行函数表达式( ... 查看详情

《你不知道的javascript》整理——作用域提升与闭包

最近在读一本进阶的JavaScript的书《你不知道的JavaScript(上卷)》,里面分析了很多基础性的概念。可以更全面深入的理解JavaScript深层面的知识点。 一、函数作用域1)函数作用域就是作用域在一个“Function”里,属于... 查看详情

作用域闭包《你不知道的javascript(上)》(代码片段)

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是当前词法作用域之外执行。 functionfoo()vara=2;functionbar()console.log(a);//2bar();foo();functionfoo()vara=2;functionbar()console.log(a);returnbar;varbaz=foo();baz();// 查看详情

作用域闭包《你不知道的javascript(上)》(代码片段)

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是当前词法作用域之外执行。 functionfoo()vara=2;functionbar()console.log(a);//2bar();foo();functionfoo()vara=2;functionbar()console.log(a);returnbar;varbaz=foo();baz();// 查看详情

你不知道的javascript(上卷)读书笔记之一----作用域

你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些”坑”,在这里写一些博客记录一下笔记以便消化吸收。1编译原理在此书中,开始便提出:Javascript是一门编译型语言,我... 查看详情

你不知道的javascript(上卷)读书笔记之二----词法作用域

在前一篇文章中,我们把作用域定义为”管理、维护变量的一套规则”,接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是动态作用域,Javascript采用... 查看详情

你不知道的javascript1(作用域与闭包)(代码片段)

1.编译原理:首先,JavaScript是解释性语言,编译一行,执行一行JavaScript运行三部曲:1.语法分析2.预编译3.解释执行语法分析:js引擎来检查代码是否存在语法错误预编译:简单理解,就是在内存中开辟一些空间来声明存放一些变... 查看详情

你不知道的javascript--上卷--读书笔记1

作用域是什么?  答:在《你不知道的javascript》书中提到,作用域就是根据名称查找变量的一套规则。古语有“无规矩不成方圆”,但是没有方圆,规矩又给谁用?所以个人理解作用域就是“规矩”+”方圆“。作用域是在创... 查看详情

读书笔记你不知道的javascript(上卷)--作用域是什么

第一章作用域1、理解作用域几个名词的介绍引擎:从头到尾负责整个JavaScript程序的编译及执行过程编译器:负责语法分析及代码生成器等脏活累活作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实... 查看详情

闭包浅解析(代码片段)

资料来源:《你不知道的Javascript(上卷)》functionfoo()vara=2;functionbar() console.log(a);returnbarvarbaz=foo();baz();//2这就是闭包效果在这个例子中,bar()在自己定义的词法作用域(foo函数内)以外的地方执行。在foo()函数执行之后,按理说应该... 查看详情

读书笔记-你不知道的js上-闭包与模块

闭包定义   当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。  看一段最简单的闭包代码:functionfoo(){vara=2;//闭包functionbar(){console.log(a);}returnbar;}//理论上foo执行完内部... 查看详情