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

1.词法阶段

首先我们要理解”词法阶段”这个词语,我们已经了解到Js存在一个编译阶段,编译阶段的第一步就是分词/词法分析,我们可以简称为”词法阶段”

简单来说,词法作用域就是定义在词法阶段的作用域,词法作用域是你在写代码时把变量和块作用域写在哪里来决定的,词法分析器处理代码后,在大部分情况下会保持作用域不变。我们需要注意以下几点:

a.当引擎需要查询变量时,总是从当前作用域开始查找

b.作用域查找会在找到第一个匹配的标识符时停止

c.遮蔽效益(内部的标识符”遮蔽”了外部的标识符)

d.全局变量会自动成为全局对象的属性,通过这种技术可以间接的访问那些被遮蔽的全局变量

e.无论函数在哪里被调用,也无论它如何被调用,它的词法作用域也只由它被声明的位置决定

f.词法作用域之会查找一级标识符,比如a、b、c。如果代码中引用了foo.bar.baz,词法作用域只会试图查找foo标识符,然后在使用对象属性访问规则进行对bar以及baz的访问

2.欺骗词法

我们有时可以使用一些语句对词法作用域进行欺骗,但是要注意的一点:欺骗词法作用域会导致性能下降

2.1 eval()

eval() 接受一个字符串参数,将这段字符串视作Javascript执行

在严格模式下,eval()中的代码有自己的词法作用域,因此其中的声明无法修改作用域外的代码的效果,而在非严格模式下,eval()中的代码可以修改eval()方法所在的作用域,即eval()方法中的所有声明与eval()方法处于同一个词法作用域,因而可以修改最终的效果。

new Function(...) 类似,将对传入的字符串动态生成函数,因此不作过多阐述。

2.2 with()

with(obj){ … } 实质上是创建了或者指向了obj中的词法作用域,在这个作用域中,所有的声明在被引擎执行时,都会在这个作用域中查找,如果查找不到,会在obj的上一层作用域继续查找,但是,当如果一直到顶层的全局作用域还没有找到时,会创建一个全局变量。并且,with在严格模式下被完全禁止运行。

2.3  性能

eval() 和 with() 会在运行时修改或创建作用域,以此来欺骗其他词法作用域。但是会极大的降低代码的运行效率,有可能之前对代码进行的优化会全部无效,使得代码的运行变得很慢。

你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域的更多相关文章

  1. JS闭包—你不知道的JavaScript上卷读书笔记(二)

    关于闭包,初学者会被绕的晕头转向,在学习的路上也付出了很多精力来理解. 让我们一起来揭开闭包神秘的面纱. 闭包晦涩的定义 看过很多关于闭包的定义,很多讲的云里雾里,晦涩难懂.让不少人以为闭包是多么玄乎 ...

  2. JavaScript词法作用域—你不知道的JavaScript上卷读书笔记(一)

    前段时间在每天往返的地铁上抽空将 <你不知道的JavaScript(上卷)>读了一遍,这本书很多部分写的很是精妙,对于接触前端时间不太久的人来说,就好像是叩开了JavaScript的另一扇 ...

  3. 《你不知道的JavaScript》读书笔记(二)词法作用域

    JavaScript 采用的是 词法作用域 的工作模型. 定义 词法化:大部分标准语言编译器的第一个工作阶段叫词法化(单词化),这个过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词 ...

  4. JavaScript中的对象与原型—你不知道的JavaScript上卷读书笔记(四)

    一.对象 对象可以通过两种形式定义:声明(文字)形式和构造形式.即: var myObj = { key: value // ... }; 或: var myObj = new Object(); m ...

  5. JavaScript中的this—你不知道的JavaScript上卷读书笔记(三)

    this是什么? this 是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件.this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式.当一个函数被调用时,会 ...

  6. 你不知道的javascript 上卷 读书笔记

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 《你不知道的JavaScript》读书笔记(一)作用域

    名词 引擎:从头到尾负责整个 JavaScript 程序的 编译 及 执行 过程. 编译器:负责 语法分析 及 代码生成. 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套 ...

  8. 《你不知道的javascript》读书笔记2

    概述 放假读完了<你不知道的javascript>上篇,学到了很多东西,记录下来,供以后开发时参考,相信对其他人也有用. 这篇笔记是这本书的下半部分,上半部分请见<你不知道的java ...

  9. 《你不知道的javascript》读书笔记1

    概述 放假读完了<你不知道的javascript>上篇,学到了很多东西,记录下来,供以后开发时参考,相信对其他人也有用. js的工作原理 引擎:从头到尾负责整个js的编译和运行.(很大一部 ...

随机推荐

  1. 装配bean

    spring有三种装配bean的方式:隐式装配.java代码装配.xml装配 隐式装配最为省事方便,也称为自动化装配 这三种装配方式可以混搭着来用 在这里通过一个例子来讲述配置 CD的两个实现,一个是 ...

  2. ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

    ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...

  3. HTML5 学习笔记(四)——canvas绘图、WebGL、SVG

    一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...

  4. CSS的::selection使用方法

    请选择本页面文本看看:http://hovertree.com/h/bjaf/38hq6y9d.htm CSS改变默认文本选中的颜色的方法 一般情况下在网页里的文本我们用鼠标选中的时候都是蓝色的,这个 ...

  5. (转)SQL 优化原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  6. hibernate(2) —— 主键策略

    框架提供了三种主键生成方式,一种是由用户自己维护,一种是由hibernate框架维护,另一种是由数据库维护. 自己维护就是在插入数据的时候,一定要指定主键的值,否则会出错,如果由框架维护和由数据库维护 ...

  7. 完美 全兼容 解决 文字两端对齐 justify 中文姓名对齐

    text-align:justify; 所有浏览器都支持,text-justify之类的却只有IE支持,就不要考虑了. justify我的理解,使元素内部的子元素两端对齐,子元素当然只能是inline ...

  8. 全文检索引擎 Solr 部署与基本原理

    全文检索引擎 Solr 部署与基本原理 搜索引擎Solr环境搭建实例 关于 solr , schema.xml 的配置说明 全文检索引擎Solr系列-–全文检索基本原理 一.搜索引擎Solr环境搭建实 ...

  9. MVC学习系列2--向Action方法传递参数

    首先,新建一个web项目,新建一个Home控制器,默认的代码如下: public class HomeController : Controller { // GET: Home public Act ...

  10. [C#6] 5-自动属性增强

    0. 目录 C#6 新增特性目录 1. 老版本代码 internal class Person { public string Name { get; private set; } public in ...