《你不知道的javascript》——词法/函数/块作用域

cx2016 cx2016     2022-12-26     742

关键词:

 

你不知道的JavaScript(上卷)

 
 

视频选集

1/4

 

技术图片

 

 

技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 

技术图片

 

 技术图片

 

 技术图片

 

欺骗词法:

作用域恶魔

 

技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 

另外一个不推荐使用 eval(..) 和 with 的原因是会被严格模式所影响(限 制)。with 被完全禁止,而在保留核心功能的前提下,间接或非安全地使用 eval(..) 也被禁止了。

技术图片

 

 

技术图片

 

 

隐藏函数内部实现

 

技术图片

 

 for 循环永远不会停止

var i 在全局作用域,每次调用 bar 函数就会被重置为3

 

解决方案之一:

技术图片

 

 

解决方案二:

技术图片

 

 类似地:模块封装

 

技术图片

 

 

 

技术图片

 

技术图片

 

 

具名:自身的引用更容易

技术图片

 

 

 

 

技术图片

 

 技术图片

 技术图片

 

 

技术图片

 

 技术图片

 

 

UMD模式:

技术图片

 

 

块作用域:

js 里面 if else 并没有实现块作用域

 

with 是一个块级作用域

技术图片

 

 

try catch 

技术图片

 

 

 

es6:let / const

技术图片

 

 

var 改 let,则只作用于块内

 

技术图片

 

 

技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

变量的声明:编译阶段;

变量的赋值:运行阶段;

 

技术图片

 

 

 

函数声明也会提升(比如 下面报的不是 type error : foo is not a func 错误

技术图片

 

 

技术图片

 

 提升只适用于作用域内

var a=2 并不在外面的作用域,所以console.log(a) 就是 not defined 错误了

 

技术图片

 

 

重复的 var 声明会被忽略掉(再次声明直接取前续声明的LHS地址),但出现在后面的函数声明还是可以覆盖前面的 

函数重复声明:后面的声明会覆盖前面的声明

 

技术图片

 

 

技术图片

 

 

技术图片

 

 

let 和 const 关键字不会造成提升

 

 

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

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

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

...以访问它们被定义时所处的作用域中的任何变量,这就是JavaScript的闭包。闭包有哪些应用?  答:函数作为返回值:functionfoo(){vara=2;functionbar(){//bar拥有涵盖foo作用域的闭包,并对它保持 查看详情

作用域闭包《你不知道的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(this)

 对this的常见误解  this指向函数本身;  this指向函数的词法作用域;this是在运行时进行绑定的,并不是在编写时,它的上下文取决于函数调用时的条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用... 查看详情

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

...要的工作类型,一种是词法作用域,一种是动态作用域,Javascript采用的是词法作用域,关于动态作用域的有兴趣的可以自行Google。1.词法阶段         首 查看详情

你不知道的javascript-2.词法作用域

考虑以下代码:functionfoo(a){varb=a*2;functionbar(c){console.log(a,b,c);}bar(b*3);}foo(2);//2,4,12在这个例子中有三个逐级嵌套的作用域。 包含着整个全局作用域,其中只有一个标识符:foo。 包含着foo所创建的作用域,其中有三个标识符... 查看详情

你不知道的js系列(7)-欺骗词法作用域(代码片段)

...得不更改作用域,尽管这是不被推荐的,那是什么办法,JavaScript中有两种机制来实现这个目的 evalfunctionfoo(str,a)  eva 查看详情

你不知道的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... 查看详情

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函数作用域关于函数声明与函数表达式立即执行函数表达式( ... 查看详情

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

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

《你不知道的javascript上卷》学习笔记(代码片段)

第一部分:作用域和闭包一、作用域1.作用域:存储并查找变量的规则2.源代码在执行之前(编译)会经历三个步骤:分词/此法分析:将代码字符串分解成有意义的代码块(词法单元)解析/语法分析:将词法单元流转换成抽象语... 查看详情

js随笔(你不知道的js)

    很多开发者不会深入思考程序出现和预期不一样的结果,只会回避并用其他方法来达到目的 一.闭包  无论通过何种方式将函数传递到词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个... 查看详情

js你不知道的javascript笔记-this-四种绑定规则-绑定优先级-绑定例外-箭头函数(代码片段)

文章目录1.为什么要用`this`2.关于`this`的误解2.1`this`不是指向函数自身2.2`this`不指向函数的词法作用域3.什么是调用栈与调用位置4.`this`的绑定规则4.1默认绑定`fun()`4.2隐式绑定`obj.fun()`隐... 查看详情

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

五、作用域闭包:? 闭包不是神奇的魔法,它只是遵循我们前几章一直介绍的词法作用域书写代码的自然结果。? 闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量。一... 查看详情

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

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

《你不知道的javascript》整理——this

最近在读一本进阶的JavaScript的书《你不知道的JavaScript(上卷)》,这次研究了一下“this”。当一个函数被调用时,会创建一个活动记录(执行上下文)。这个记录会包含函数在哪里被调用(调用栈)、函数的调用方法、... 查看详情

你不知道的js系列(5)-词法作用域(代码片段)

作用域分为两种,一种是词法作用域,一种是动态作用域,我们先看第一种,词法作用域 词法作用域就是定义在词法阶段的作用域(编译器的第一个工作阶段叫做词法化,词法化的过程会对源代码中的字符进行检查)。换句... 查看详情