在学习《你不知道的JS》一书中,特将作用域相关知识在此分享一下:

#说到作用域,就不得不提到LHS查询和RHS查询:

1)如果查询目的是对变量进行赋值,则使用LHS查询

2)如果查询目的是获取变量的值,则使用RHS查询

作用域的查询都会从当前执行的作用域开始查找,如果没有找到所需要的标识符,就会向上级作用域继续查找,直到抵达全局作用域为止

# 当进行RHS查询时无法找到该变量,引擎则会抛出ReferenceError的异常

代码示例如下:

        function foo(a){
            console.log(a+b);
            b = a;
        }
        foo(2);

在此代码示例中未声明b变量,因此RHS查询时无法找到它,则抛出ReferenceError异常

#当RHS查询时找到了变量,但试图对一个非函数类型的值进行函数调用,或者引用null或undefined类型的值中的属性,则引擎会抛出另一种异常:TypeError

在作用域查找中还有非常重要的一点: "遮蔽效应"

作用域查找会在找到第一个匹配的标识符时停止,在多层嵌套作用域中可以定义同名的标识符,叫做'遮蔽效应'

代码示例如下:

        var b = 4;
function foo(a){
var b = 3;
console.log(a+b); }
foo(2);//5

这里由于作用域查找中具有遮蔽效应,引擎会先找到执行作用域中的 var b = 3,将执行作用域名之外的 var b = 4遮蔽,因此即便外面也用的是相同的变量b作为标识符,也并不影响函数的执行

那么如何来访问那些被同名变量所遮蔽的全局变量呢,在这里,我们可以引入window.a的技术;

注意:通过这种技术可以访问那些被遮蔽的全局变量,但非全局的变量被遮蔽则无论如何都无法被访问

JS作用域相关知识(#精)的更多相关文章

  1. js作用域相关知识总结

    以前总是搞不清楚js里面的作用域.块级作用域.预解析,做题总做错,今天彻底搞明白了,来记录梳理一下~ 块级作用域 在其他语言中,任何一对花括号中的语句都属于一个块儿,在这之中定义的所有变量在代码块外都 ...

  2. JS基础理论相关知识

    1.XHTML和HTML有什么区别 HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同:XHTML 元素必须被正确地嵌套.XHTML 元素必须被关闭.标签名必须用 ...

  3. js作用域相关笔记

    1.js引擎.编译器.作用域. 引擎:负责JS全过程的编译和执行: 编译器:负责语法分析和代码生成: 作用域:负责收集并维护声明组成的查询,以及当前执行代码对这些变量的访问权限(简言之,作用域就是用于 ...

  4. js数组相关知识集合

    一.js数组快速排序 <script type="text/javascript"> var arr = [1, 2, 3, 54, 22, 1, 2, 3]; fun ...

  5. js键盘相关知识总结

    一.相应事件 keydown:按下键盘上的任意键都可触发,按着不放则重复触发 keypress:按下键盘上的字符键时触发,按着不放则重复触发 keyup:释放按键时触发 事件顺序:keydown> ...

  6. codewars--js--vowels counting+js正则相关知识

    问题描述: Return the number (count) of vowels in the given string. We will consider a, e, i, o, and u as ...

  7. css+js+html基础知识总结

    css+js+html基础知识总结 一.CSS相关 1.css的盒子模型:IE盒子模型.标准W3C盒子模型: 2.CSS优先级机制: 选择器的优先权:!important>style(内联样式) ...

  8. JS 作用域与变量提升---JS 学习笔记(三)

    你知道下面的JavaScript代码执行时会输出什么吗? var foo = 1; function bar() { if (!foo) { var foo = 10; } console.log(f ...

  9. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

随机推荐

  1. 3450: Tyvj1952 Easy

    3450: Tyvj1952 Easy Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 269  Solved: 198[Submit][Status] ...

  2. image图片拉伸

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1d9421 } p.p2 ...

  3. JAVA面试题和答案(二)

    本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能 ...

  4. kali linux 折腾笔记

    http://xiao106347.blog.163.com/blog/static/215992078201342410347137/ 这里告诉你刚刚装好kali后要做,有些也是不正确的,可能开始你 ...

  5. ASP.NET MVC创建视图过程

    MvcHandler.ProcessRequest()   (1)获取Action执行结果:context2.Result ActionExecutedContext context2 = this. ...

  6. 在VM中给Linux安装Tool

    1.导入tool 2.解压tool 3.打开终端,进入tool的目录,输入  ./XXXXXXX.pl 4.进入安装界面,不断回车即可

  7. java操作txt文本(二):删除文本括号内的内容

    想法由来:之前写读书报告时,遇到一些烦人的文献,总喜欢把注释作为括号内容放到正文中,使文章繁琐冗长,所以写了下面这个代码,剔除了括号内的内容. 适用条件:原txt文本中的括号使用正确,即左右括号匹配正 ...

  8. sass学习笔记 -- sass的四种编译方法

    sass的四种编译方法:(.scss) (一)ruby下的命令行编译 首先需要安装ruby,注意需勾选Add Ruby executables to your PATH选项,以添加环境变量. ruby ...

  9. Sql(in与exists)

    1.如果查询的两表大小相当,那么用in和exists差别不大,如果两个表中一个较小一个较大,则子查询表小的用exists,子查询表大的用in. 2.not in逻辑上不完全等同于not exists, ...

  10. sui的一些方法封装

    + function($) { "use strict"; var today = new Date(); var getDays = function(max) { var da ...