转载:http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html

作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。

JavaScript作用域

任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

  1.  全局作用域(Global Scope)

  在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域

  (1)最外层函数在最外层函数外面定义的变量拥有全局作用域,例如:

var authorName="山边小溪";
function doSomething(){var blogName="梦想天空";function innerSay(){alert(blogName);}innerSay();
}
alert(authorName); //山边小溪
alert(blogName); //脚本错误
doSomething(); //梦想天空
innerSay() //脚本错误

(2)所有末定义直接赋值的变量自动声明为拥有全局作用域,例如:

function doSomething(){var authorName="山边小溪";blogName="梦想天空";alert(authorName);
}
doSomething(); //山边小溪
alert(blogName); //梦想天空
alert(authorName); //脚本错误

变量blogName拥有全局作用域,而authorName在函数外部无法访问到。

(3)所有window对象的属性拥有全局作用域

  一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

  2.  局部作用域(Local Scope)  
  和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域,例如下列代码中的blogName和函数innerSay都只拥有局部作用域。

function doSomething(){var blogName="梦想天空";function innerSay(){alert(blogName);}innerSay();
}
alert(blogName); //脚本错误
innerSay(); //脚本错误

作用域链(Scope Chain)

在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

  当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。例如定义下面这样一个函数:

function add(num1,num2) {var sum = num1 + num2;return sum;
}

在函数add创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量,如下图所示(注意:图片只例举了全部变量中的一部分):

[未完整]JavaScript 开发进阶:理解 JavaScript 作用域和作用域链相关推荐

  1. JavaScript 开发进阶:理解 JavaScript 作用域和作用域链(上)

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

  2. JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

  3. JavaScript经典进阶:javascript – 9宫格 – 拼图

    项目地址:javascript – 9宫格 – 拼图 总体思路 切图 ==>打乱顺序 ==>拖拽实现数据交换 实现过程中,遇到的问题 数据随机排序方法 Array.sort( functi ...

  4. javascript 符号_理解JavaScript中“ =”符号的直观指南

    javascript 符号 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 理解JavaScript中" ="符号的直观指南 (A Visu ...

  5. JavaScript开发调试篇 - JavaScript shell

    博文主要内容: 主要介绍开发调试JavaScript代码的工具,用来快速测试 JavaScript 代码片段 1. JavaScript shell 的安装及使用 2. 在线调试:介绍一个功能强大的在 ...

  6. JavaScript大杂烩4 - 理解JavaScript对象的继承机制

    JavaScript是单根的完全面向对象的语言 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承.而在JavaScript的 ...

  7. 【Javascript】深入理解this作用域问题以及new/let/var/const对this作用域的影响

    理解this作用域 <javascript高级程序设计>中有说到: this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,t ...

  8. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点

    才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...

  9. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)

    才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...

最新文章

  1. Centos7 防火墙和Selinux 一些简单操作命令
  2. 处理JSON格式的数据
  3. 关于读完《软件工程》之后不解的问题
  4. ABB SocketReceive 套接口 函数
  5. 梅原对justin wang 真人版
  6. 本地Android源代码库下载源码
  7. ExtJs非Iframe框架加载页面实现
  8. 使用指针实现char型数组,并将输入的字符倒序输出
  9. 关于浮点数的剪不断理还乱
  10. 5.SOA架构:服务和微服务分析及设计--- REST服务建模过程
  11. 【笔记】时间片轮转 RR 进程调度算法(Java 实现)
  12. 希赛软考学习包,助您快通过软考考试
  13. Power Designer创建概念数据模型
  14. 三维分子图的球面信息传递
  15. 2021年口碑超好旗舰:蓝牙耳机排行榜10强推荐
  16. 记录下对游戏主机配置的个人理解与心得
  17. mysql操作语句类型DQL\DML\DDL\DCL
  18. iTerm2 + oh-my-zsh + powerlevel9k 打造你喜欢的编码终端
  19. CUDA在VS中的环境搭建
  20. 新浪微博桌面客户端2014 v3.0.5 官方正式版

热门文章

  1. BIRD is not ready: BGP not established
  2. Oracle回收站空间使用与清理
  3. 木耳不能和什么一起吃 木耳的禁忌人群
  4. 计算机小高考,参加小高考可以选什么专业?参加小高考有什么好处?
  5. 海康4200平台与国标GB28181视频平台EasyGBS级联后不能播放的排查及解决方法
  6. opencv柱面投影
  7. ElasticSearch由浅入深
  8. python-06-列表
  9. 【程序设计训练】1-3 拳王阿里
  10. 曹德旺:钱让人焦虑,现在年轻人太急功近利