这几天看犀牛书的一点心得和总结,做个笔记吧,主要是概念层面的,JS高手大可忽略。

变量的作用域
变量的作用域其实很简单:在函数内定义的局部变量只在本函数内有效,在所有函数体外定义的变量在JS代码的全局有限,叫全局变量。有一个特殊情况,如果有全局变量和局部变量重名了,局部变量优先级高于全局变量,为什么会这样?后面再加以解释。

变量与对象属性
在学习Javascript的时候,会发现变量的使用与对象属性非常类似,比如赋值,已经在表达式中的使用方式,你甚至就可以把JS里面的每一个变量都理解为对象的属性。

var a = 10;
var sampleObj = {value1:10; value2:20}
sum = a + sampleObj.value1 //计算结果是20因为在Javascript解释器运行的时候,它总是会首先创建一个全局对象,你定义的全局变量其实就是这个全局对象的属性。

在函数中定义的局部变量同样是对象的属性,这个对象比较特殊,它叫调用对象。在Javascript解释器每次执行一个函数的时候,都会为这个函数创建一个执行环境,而这个执行环境会创建一个调用对象。不同的函数的执行环境是彼此独立的,而在所有函数之外的代码执行环境叫做全局执行环境。

现在再回头总结一下,JS解释器解释代码前创建了一个全局对象,在代码执行到函数之前,代码在全局执行环境中;当解释器执行函数时,进入函数独立的执行环境,并创建调用对象,在函数中定义变量相当于定义了这个调用对象的一个属性。现在能理解了吧?

变量的作用域链
本文开头关于局部变量和全局变量优先级的问题,很快就能解释了,不过首先要知道作用域链的概念。“每个Javascript执行环境都有一个与它关联在一起的作用域链。”这是犀牛书上的表述,把它翻译成大白话就是:作用域的优先级顺序。

作用域链作用:
当Javascritp需要查询变量x的值时,它首先开始查询作用域链的第一个对象,如果该对象有名为x的属性,就采用这个值,如果没有,就查询作用域链上的第二个对象,以此类推。

作用域链的顺序:
根据执行环境来定,假设当前执行环境在两层嵌套的局部函数中,当前函数的调用对象处于作用域链第一位,外层函数调用对象在作用域链第二位,然后再外面的全局对象在第三位。

因此,在函数内部定义的局部变量肯定有比同名全局变量更高的优先级。

转载于:https://www.cnblogs.com/hanwest/archive/2013/01/29/2881880.html

JS作用域链(转载)相关推荐

  1. js作用域链以及全局变量和局部变量

    > [带var] > 在当前作用于中声明了一个变量,如果当前是全局作用域,也相当于给全局作用域设置了一个属性叫做a ```javascript //=>变量提升:var a; < ...

  2. Js作用域链及变量作用域

    要理解变量的作用域范围就得先理解作用域链  用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性.  作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象 ...

  3. JS 作用域和作用域链

    作用域 JavaScript 中的作用域是我们可以有效访问变量或函数的区域.作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 有两种类型的作用域:全局作用域.局 ...

  4. JavaScript学习笔记——JS中的变量复制、参数传递和作用域链

    今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...

  5. JS 总结之函数、作用域链

    在 JavaScript 中,函数实际上是一个对象. ? 声明 JavaScript 用 function 关键字来声明一个函数: function fn () {} 复制代码 变体:函数表达式: v ...

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

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

  7. 1月8日学习内容整理:JS的作用域和作用域链

    补充: 对于编译型语言,是编译一次生成可执行文件来执行多次:对于解释型语言,始终都是编译一次执行一次 python编译时要看有没有赋值操作,没有的话就不编译任何内容:若有赋值操作,才会开辟内存空间,把 ...

  8. js 预编译 解释执行 作用域链 闭包

    <script>var a,b = 1;function c(x){var aa = 2;function d(){var ab = 3;}}var d = function(){//.. ...

  9. js作用域与作用域链

    一直对Js的作用域有点迷糊,今天偶然读到JavaScript权威指南,立马被吸引住了,写的真不错.我看的是第六版本,相当的厚,大概1000多页,Js博大精深,要熟悉精通需要大毅力大功夫. 一:函数作用 ...

最新文章

  1. python操作文件夹-Python文件操作大全,随机删除文件夹内的任意文件
  2. Android性能优化
  3. 从机器学习谈起(机器学习简介)
  4. WINXP 提升速度
  5. 数组元素倒置-Java
  6. 学习基础和C语言基础调查
  7. JavaScript的输出(2)
  8. 使用Cscope阅读Linux源码
  9. 自己试着在阿里云布了个服务器
  10. 名字正则只能是中文英文_【R语言新书】1.5 正则表达式
  11. 木蚂蚁软件光盘 V2.0 2008元旦贺岁版
  12. vijos 1602
  13. 方志朋-2018年文章汇总
  14. 华为往事(五)--Camp;C08
  15. Maven五分钟入门
  16. SDN相关组织——ONF
  17. Spark技能成长,CSDN就go了!
  18. 一款界面友好的思维导图软件MindMaster
  19. 华为畅享10与10s有什么区别?哪个更好
  20. LeetCode 14.最长公共前缀(字符串)

热门文章

  1. linux日志搜索关键词_linux中的实用技巧和快捷键总结
  2. mysql 建立索引_mysql建立索引的原则
  3. 在tomcat服务器部署finereport
  4. 在Linux系统下生产者消费者,Linux线程编程之生产者消费者问题
  5. no number java_java.lang.NumberFormatException问题!!!
  6. 华为跨域bgp_通知:2019华为认证体系全新升级!
  7. weixintong ent.php,多商户版微信商城对接微信公众号的方法及设置
  8. java web 手机验证_JAVA-WEB,好知网,登录注册,手机验证
  9. 微信小程序引用php函数,微信小程序Page中data数据操作和函数调用详细介绍
  10. 计算机课教学要求,《计算机基础课程教学基本要求》研制报告