你不知道的JavaScript学习笔记1——作用域
处理程序三要素:
引擎:编译与执行过程。
编译器:语法分析与代码生成等。
作用域:收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
示例:
var a=2;的解析过程:
1.编译器 询问 作用域 是否已经有该名称的变量
是:忽略该声明,继续执行;
否:声明一个新变量,命名为a;
2.编译器为引擎生成代码
引擎运行首先询问作用域,在当前作用域集合中是否存在一个a的变量:
是:引擎会使用这个变量;
否:引擎继续查找该变量;
找到了:将2赋值给a。
没找到:抛出异常。
总结:
变量赋值执行两个动作:
1.编译器声明一个变量;
2.运行时引擎在此作用域中查询(LHS查询)该变量,能找到就赋值。
引擎查询方式:
"L"和"R"分别代码左侧和右侧。什么东西的左侧和右侧?是一个赋值操作的左侧和右侧。
当变量出现在赋值操作的左侧时进行LHS查询,出现在右侧时执行RHS查询。
LHS查询:
1.赋值操作的目标是谁;
2.查找的目的是对变量进行赋值(=操作符或调用函数时传入参数的操作)。
RHS查询:
1.谁是赋值操作的源头;
2.查找的目的是获取变量的值。
报错类型:
ReferenceError异常:
1.严格模式下不成功的LHS(非严格模式下不成功的LHS会导致自动隐藏地创建一个全局变量并不会报异常);
2.不成功的RHS。
TypeError异常:
如果 RHS 查询找到了一个变量,但是你尝试对这个变量的值进行不合理的操作,比如试图对一个非函数类型的值进行函数调用,或着引用 null 或 undefined 类型的值中的属性,那么引擎会抛出另外一种类型的异常。
作用域嵌套规则:
引擎从当前的执行作用域开始查找变量,如果找不到,就向上一级继续查找。
你不知道的JavaScript学习笔记1——作用域的更多相关文章
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
JavaScript:学习笔记(7)——VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...
- JavaScript:学习笔记(4)——This关键字
JavaScript:学习笔记(4)——This关键字 以前这篇帖子是关于闭包的,但是我想弄明白的其实是This关键字.JavaScript的this和Java等面向对象语言中的this大不一样,bi ...
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿的JavaScript学习笔记(3——this/call/apply)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
随机推荐
- 很全的Python 面试题 github
https://github.com/taizilongxu/interview_python
- T-SQL 之 公用表表达式(CTE)
在编写T-SQL代码时,往往需要临时存储某些结果集.在CTE之前常用的两种临时存储结果集为:临时表和表变量.除此之外,还可以使用公用表表达式的方法. 公用表表达式(Common Table Expre ...
- 协议名称处理函数xxxprotoxxx()
为了方便操作,Linux提供了一组用于查询协议的值及名称的函数. xxxprotoxxx()函数: 上面的函数对文件/etc/protocols中的记录进行操作,文件中记录了协议的名称.值和别名等值, ...
- flip 翻转效果 css3实现
1.实现代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT ...
- javascript:void(0)和onclick=fn(this)
今天在写代码中遇到一个这样的问题.关于点击在html中添加点击事件,顺便把this对象通过参数传过去. <a href='#' \>查看详情</a> <a href='j ...
- 【Linux】less命令
用途 less主要用于查看档案内容,与more的功能一致,但是比more更强大 全称 less的全称就为less 说明 空格键 :代表向下翻一页 pagedown : 代表向下翻一页 pageup:向 ...
- Appium安装过程
Appium安装过程 先安装了 Node.js.在node的官网上下载的exe安装文件. 在node的command line中执行 npm install -g appium 来安装appium,报 ...
- mysql优化 慢查询(一)
1.显示慢查询的一些参数的命令:show variables like '%slow%';结果如图
- MVC之Ajax.BeginForm使用详解之更新列表 mvc验证jquery.unobtrusive-ajax
MVC之Ajax.BeginForm使用详解之更新列表 1.首先,请在配置文件设置如下:(该项默认都存在且为true) <add key="UnobtrusiveJavaScrip ...
- EMQ ---客户端clientid为空,emq会随机帮忙生成
mqtt v3.1.1协议有规定clientid可以为空,所以当客户端clientid为空,emq会随机帮忙生成. 如果clientid为空,随机生成clientid.例如'emqttd_105789 ...