引用《你不知道的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的更多相关文章

  1. JS作用域面试题总结

    关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量) ...

  2. js作用域问题

    <script type="text/javascript"> alert(i);//Uncaught ReferenceError: i is not defined ...

  3. js 作用域

    js 作用域 js作用域链查找,子函数能取到父函数中定义的变量. 前段时间误写成如下形式: 这只是普通的函数调用,没有父子的关系,child()函数会在全局查找pi变量,没找到所以报错. 最近发现原来 ...

  4. 08.01 签到! js 作用域

    js 作用域 : 1.js 没有块作用域 : for (var i = 0;i < 4; i++){ } alert(i) // i = 3 2.js 没有动态作用域: function f1( ...

  5. js作用域链

    js作用域链 <script> var up = 555; function display(){ var innerVar = 2; function inner(){ var inne ...

  6. easyui datagrid load 封装 参数问题 js 作用域

    var temp = { LoginAccount: $('#LoginAccount').val(), ShopName: $('#ShopName').val() }; function doSe ...

  7. js作用域零碎的知识点,不同的script块,虽然同是全局变量

    如下代码,第一次弹出a,因为解析器里找到var a,赋予a变量undefined,弹出undefined <!DOCTYPE html> <html> <head> ...

  8. JS作用域,作用域,作用链详解

    前言   通过本文,你大概明白作用域,作用域链是什么,毕竟这也算JS中的基本概念. 一.作用域(scope) 什么是作用域,你可以理解为你所声明变量的可用范围,我在某个范围内申明了一个变量,且这个变量 ...

  9. JS作用域和ASP(vbs)作用域比较

    一.js作用域,先上图: 以上代码执行的效果是,依次弹出 undefined, undefined, a, a,为什么是这样的结果啦?因为JS的作用域为链式作用域. 作用域链: 用VAR声明一个变量时 ...

随机推荐

  1. Linux下查看文档指令

    1,cat直接查看 cat /etc/profile 2,more,less分页查看 less  /etc/profile more /etc/profile less -N /etc/profile ...

  2. mybatis四大接口之 Executor

    [参考文章]:Mybatis-Executor解析 1. Executor的继承结构 2. Executor(顶层接口) 定义了执行器的一些基本操作: public interface Executo ...

  3. tkinter的grid布局中合并单元格

    rowspan  合并多行,比如:Label(root,text="table",width=10,height=2,),grid(row=0,column=0,rowspan=2 ...

  4. node.js中的回调

    同步和阻塞:这两个术语可以互换使用,指的是代码的执行会在函数返回之前停止.如果某个操作阻塞,那么脚本就无法继续,这意味着必须等待. 异步和非阻塞:这两个术语可以互换使用,指的是基于回调的.允许脚本并行 ...

  5. Service Fabric学习-从helloworld开始(无状态服务)

    原先做服务器程序, 都是部署在xx云上, 也没理解云是个啥, 不就是个服务器(虚拟机)租赁商吗? 好吧, 其实这个是IaaS, 而接下来要学习的ServiceFabric(以下简称SF)是PaaS. ...

  6. Shell 常用的命令

    ls功能:列出目录内容常用选项:-a 显示所有文件,包括隐藏的-l 长格式列出信息-i 显示文件 inode 号-t 按修改时间排序-r 按修改时间倒序排序-h 打印易读大小单位 2 echo功能:打 ...

  7. 接口测试学习笔记(Jmeter)

    常见接口协议: 1.http 超文本传输协议 2.https 安全超文本传输协议 3.ftp 文件传输协议 4.tcp 网络控制协议 5.IP 互联网协议 6.udp 用户数据协议 -- HTTP协议 ...

  8. Chapter 3 Phenomenon——23

    Charlie put one arm behind my back, not quite touching me, and led me to the glass doors of the exit ...

  9. java-jmx使用

    先粘一段内容 .程序初哥一般是写死在程序中,到要改变的时候就去修改代码,然后重新编译发布. .程序熟手则配置在文件中(JAVA一般都是properties文件),到要改变的时候只要修改配置文件,但还是 ...

  10. mysql pdo设置显示报错

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);