学习笔记:(图中水印来自同名微信订阅号,现已改名为‘码上猿梦’)

//javaScript作用域:

//首先声明一点,js中没有块级作用域,

比如java中for循环中for(int i = 0; i < arr.length; i++){}中的变量i只能在for循环的大括号内部能访问,

//但是在js中,for(var i = 0; i < arr.length; i++){},i的作用域是包含了这个for循环的函数的作用域,或者是全局作用域.

1.全局作用域

(1).最外层函数和定义在最外层函数外面的变量具有全局作用域:

(2).没有使用var关键字声明变量

上面的代码等价于下面的代码:(没有使用var关键字声明的a自动变为全局变量)

//2.局部作用域

//与全局作用域相反,局部作用域就是声明定义在函数内部的变量或者函数,他们拥有局部作用域,也叫函数作用域,

//这些变量也叫局部变量,这些变量只能在声明定义他们的函数里面访问,

//作用域链:之前学过java, 目前在自学c#和javaScript, 学js才发现在js中真的是万物皆对象: 在普通代码中表现的比在java和c#中更加彻底. C#中的委托将函数名作为对象当成参数传递, java中也有这样的 , 那就反射. js中所有的东西都是对象, 函数也是对象, 它具有属性和方法, ( 在java中函数也可以说是方法, 但在js中这样说函数比较恰当,因为函数也是具有方法的. )

//函数和其他对象一样, 拥有可以通过代码访问的属性和一系列仅供js引擎访问的内部属性, 其中有一个内部属性就是作用域链 [[scope]] , 这个内部属性包含了函数被创建时函数作用域中所有对象 ( 函数里面的函数也是对象 ) 的集合, 这个集合被称为函数的作用域链, 它决定了哪些数据能够被这个函数访问. 每个函数都会有这样一个作用域链, 这样一来就会有很多个不同作用域链,

[[scope]] 里面存放的只是一个地址, 也就是Scope chain的地址,[[scope]]指向了Scope chain,Scope chain是一个链表结构,里面存放着各种函数作用域,其中也包括全局作用域,

//程序还没有执行的时候,这个链表的最顶端存放的是全局作用域,比如这段代码:

当函数被创建的时候,它的作用域链就会填入一个全局对象,这个全局对象包含了所有的全局变量,(只列举了部分变量)

如下图:

//如果开始执行add函数,

var total = add(5, 10);

//那么这个链表的最顶端一定是当前正在执行的函数的函数作用域(是函数作用域,不是作用域链),全局作用域自然在第二层了(其实在这里我在想,这里的链表是不是栈,这点我没有想明白,留一个疑问吧,以后再思考)

//补充一点:当执行流进入一个函数时,也就是一个函数要被执行时,会创建一个"运行时期上下文(execution context)"的执行环境,这也是一个内部对象, 这个运行时期上下文也是一个作用域链, 也是包含着该函数作用域中所有的对象, 运行时期上下文作用域链是由之前这个函数的作用域链初始化的, 然后js引擎又会去创建一个活动对象(Active Object),这个活动对象包含了函数运行期所有的局部变量,参数以及this等变量,

如下图:

//这个活动对象用于标识符的解析,也就是当你要使用一个变量时,活动对象会去它的作用域链中的一个个函数作用域去遍历寻找该变量的标识符,如果找到了就使用这个标识符对应的变量,

如果没有找到,那就向下遍历另一个函数作用域,直到找到为止,但是如果一直遍历到了全局作用域都没有找到和该标识符的定义,那就好吧,我给你报错.

(而且每个标识符都要经历这个遍历寻找的过程,所以尽量少使用全局变量,而应该多使用局部变量,有一个好的经验法则就是:如果一个跨作用域的对象被使用了一次以上,那就把它存储在局部作用域里再使用,这样也能减少代码量,但最重要的是提高了程序的性能.比如document这个全局变量,)

以上代码文字均手敲测试过,如有错误请指出,谢谢啦~~

欢迎关注同名微信订阅号:码上猿梦

笔记参考自梦想天空的博客,

博客地址:http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html

作用域js和java区别_js作用域理解相关推荐

  1. js编码java解码_Js编码和Java后台解码

    注: 在使用get提交,url传递参数的时候,会带来中文乱码的问题,对此可以使用js编码来解决. Js编码的几种方式区别: 1.window.escape()与HttpUtility.UrlEncod ...

  2. js编码java解码_js编码处理(转)

    1.使用 JS中的 encodeURIComponent或 encodeURI方法. 说明: encodeURIComponent(String) 对传递参数进行设置.不编码字符有 71个: !, ' ...

  3. js 操作java对象_js对象复制

    转至:http://apps.hi.baidu.com/share/detail/518475 在js里没有类似JAVA的clone方法,无法实现对对象的克隆,一般使用等号操作符来传递对象,但这样就造 ...

  4. js编码java解码_JS编解码与Java编解码的对应关系

    最近前段在导出数据时会遇到"illegal character"的异常错误,结果发现是在请求地址中请求参数包含了空白字符(其编码为%C2%A0)或者是空格字符(其编码为%20),之 ...

  5. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  6. js的作用域链,原型链,以及闭包函数理解

    代码一: this.number = 10 function a() {this.number = 20 } a.prototype.init = () => console.log(this. ...

  7. 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化

    js基础知识中的作用域和闭包 一.作用域 1.作用域.自由变量简介 (1)作用域定义 (2)作用域实例演示 (3)自由变量定义 (4)自由变量实例演示 2.作用域链简介 (1)作用域链定义 (2)作用 ...

  8. java的四大作用域_JSP中的四大作用域

    什么是作用域? 我们在写代码的时候,都会遇到变量的作用域的问题:比如这是一个局部变量,出了它的作用域就无法访问了.对于作用域的概念,最简单的理解就是: 在你的地盘,你还算根葱:出了你的地盘,你啥也不是 ...

  9. 浅谈JavaScript作用域,关于Java的学习路线资料

    javascript是目前web领域中使用非常广泛的语言,不管是在前端还是在后端都能看到它的影子,可以说web从业者不论怎样都绕不开它.在前端领域,各种框架层出不穷.在后端领域,nodejs可谓如火如 ...

最新文章

  1. centos在线安装svn
  2. Spark任务提交流程
  3. weinre调试移动端页面
  4. linux 关闭打开的文件描述符,关闭它们后重新打开stdout和stdin文件描述符
  5. 【struts2+hibernate+spring项目实战】ajax+jquery报表数据显示(ssh)
  6. 【工业控制】什么是波形
  7. 全球最权威人脸识别测试,中国团队依图科技夺得第一
  8. 创建java取消module_IntelliJ IDEA 2020使用之模块新建删除导入!
  9. leetcode 738. 单调递增的数字(贪心算法)
  10. Hadoop生态圈-Ambari控制台功能简介
  11. InveighZero:基于C#的数据欺骗和MitM工具
  12. 极简毕业设计答辩PPT模板
  13. 从嵌入式系统到无线模组 周立功单片机欲站在物联网的风口
  14. 服务器两个内存为何只显示4g_win10系统插入2个4G内存条却只显示4G的解决方法
  15. 听说这个深度学习工具包,可以拯救Java开发者?
  16. Cabbage教学(1)——IO和变量
  17. 读《蔡康永的说话之道》
  18. 遥感图像计算机自动分类原理,第30讲:8.1遥感图像自动识别分类
  19. 基于PHP的学生作业管理系统
  20. mysql根据成绩排名次_用mysql语句 实现按成绩 排名次

热门文章

  1. 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
  2. java获取本周的开始时间和结束时间_2020年三伏天时间表什么时候开始结束 2020年三伏具体时间表一览...
  3. python如何读取数据保存为新格式_Python Numpy中数据的常用保存与读取方法
  4. python交互式命令_从python内部运行交互式命令
  5. mongodb----集合而定多种查询方式
  6. selenium.common.exceptions.WebDriverException:no such session
  7. IOS-C语言小练习02
  8. C# 进程Process基本的操作说明
  9. ccform 单据打印的规则调整与新增功能发布说明
  10. Linux的追逐,Windows的穷途恼指日可待