JS 作用域 p1
引用《你不知道的JavaScript》中的话,如下;
负责收集并维护由所有生命的标识符(变量)组成的一系列查询并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
那么作用域实际上我理解的就是一种能力或者说在一定范围区域,他有父子之分,有嵌套之别。
概念性的内容不多说,主要是自己理解和在实际编程中使用。
在js执行时需要几个步骤、比如var a=2;
1.编译器会让作用域查询下是否存在变量a,如果有编译器将忽略、如果没有就创建一个变量命名为a
2.编译器为引擎生成运行时的代码,处理a=2的赋值操作,然后引擎为问作用域是否有a,没有的话继续向上寻找。
如果最终找到了a,就赋值。赋值就丢出一个ReferenceError: a is not defined
另一个要说的是LHS 查询和RHS 查询,
记住LHS 是 查询容器本身(或者说声明本身 比如 var a)
RHS 为赋值查询 (a=2)
L 与 R 是一种语义上的区别,并不一定非要在左边和右边,例如:
function fn(a){}; // LHS
fn(2);// RHS
再说一个大家都知道的概念,关于作用域嵌套,还是 a=2;
var a = 2;
function fn(){
console.log(a); // 2
}
LHS 和RHS 引用都会在一直向外寻找a,知道全局作用域为止。
有一个要注意的地方是:
function fn(a){
console.log(a+b);
b = a;
}
fn(2);
这里会抛出异常,异常点在哪就是 a + b,这里引擎会进行RHS 查询,结果没找到,会抛出ReferenceError: a is not defined
但是对a进行LHS 查询的时候,如果最终也没有找到 a的声明,那么会在全局作用域下创建一个全局变量a(其实不是什么好事),如果是严格模式的话,
那么就不会创建。
还有一点,如果RHS 找到了这个变量,但是你尝试做不合理的操作就会抛出TypeError异常,比如:
var a ; a = 2; a();
JS 作用域 p1的更多相关文章
- JS作用域面试题总结
关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量) ...
- js作用域问题
<script type="text/javascript"> alert(i);//Uncaught ReferenceError: i is not defined ...
- js 作用域
js 作用域 js作用域链查找,子函数能取到父函数中定义的变量. 前段时间误写成如下形式: 这只是普通的函数调用,没有父子的关系,child()函数会在全局查找pi变量,没找到所以报错. 最近发现原来 ...
- 08.01 签到! js 作用域
js 作用域 : 1.js 没有块作用域 : for (var i = 0;i < 4; i++){ } alert(i) // i = 3 2.js 没有动态作用域: function f1( ...
- js作用域链
js作用域链 <script> var up = 555; function display(){ var innerVar = 2; function inner(){ var inne ...
- easyui datagrid load 封装 参数问题 js 作用域
var temp = { LoginAccount: $('#LoginAccount').val(), ShopName: $('#ShopName').val() }; function doSe ...
- js作用域零碎的知识点,不同的script块,虽然同是全局变量
如下代码,第一次弹出a,因为解析器里找到var a,赋予a变量undefined,弹出undefined <!DOCTYPE html> <html> <head> ...
- JS作用域,作用域,作用链详解
前言 通过本文,你大概明白作用域,作用域链是什么,毕竟这也算JS中的基本概念. 一.作用域(scope) 什么是作用域,你可以理解为你所声明变量的可用范围,我在某个范围内申明了一个变量,且这个变量 ...
- JS作用域和ASP(vbs)作用域比较
一.js作用域,先上图: 以上代码执行的效果是,依次弹出 undefined, undefined, a, a,为什么是这样的结果啦?因为JS的作用域为链式作用域. 作用域链: 用VAR声明一个变量时 ...
随机推荐
- Linux巩固记录(6) Hbase环境准备-zookeeper安装
Hbase是运行在hadoop之上,所以请参考第3篇文章搭建好一个master,两个slave的hadoop环境,我采用的版本为hadoop2.7.4 不了解Hbase的同学可以参考下这篇文章,分析得 ...
- mongodb初始化并使用node.js实现mongodb操作封装
mongodb的下载只要在https://www.mongodb.com/网站就能够下载 下载后安装只用一直点next就可以,注意最好使用默认路径安装到C盘,然后在任意位置建立一个文件夹用于储存你的数 ...
- Python之lambda匿名函数使用if条件语句
C0LOR1 = "PapayaWhip" COLOR2 = "Tan" selectColor = lambda num: C0LOR1 if num % 2 ...
- CENTOS安装ElasticSearch(转)
From: https://my.oschina.net/topeagle/blog/591451?fromerr=mzOr2qzZ CENTOS安装ElasticSearch ElasticSear ...
- oracle数据库迁移相关
常见的实现方式: rman exp/imp expdp/impdp DG OGG 主要是看停机时间了,方法很多,数据量小,就导出,如果时间要求很高,那可以采取dg或ogg或类似的技术.减低downt ...
- C# 高效率创建字符串类(StringBuilder)
1.为什么需要StringBuilder类? 因为String类型代表不可变字符串,所以无法对当前String类型实例进行处理.所以FCL提供了System.Text.StringBuilder类型, ...
- Json.Net 在.Net Core 2.0 中序列化DataSet 问题
使用Asp.Net Core中自带的版本10.0.1 生成一个简单的DataSet DataSet ds2 = new DataSet(); DataTable table = new DataTab ...
- CSS3无前缀脚本prefixfree.js与Animatable使用介绍
要求 必备知识 本文要求基本了解 JAVASCRIPT 和 和 CSS3 基本知识. 运行环境 桌面端:IE9 +,Opera 10+,火狐3.5 +,Safari 4+和Chrome浏览器;移动端: ...
- Python学习--02输入和输出、运算符
命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...
- 29-hadoop-使用phtonenix工具&分页&数据导入
因为rowkey一般有业务逻辑, 所以不可以直接使用rowkey进行分页, startkey, endkey 想要使用SQL语句对Hbase进行查询,需要使用Apache的开源框架Phoenix. 安 ...