• 函数在执行的过程中,先从自己内部找变量
  • 如果找不到,再从创建当前函数所在的作用域去找,以此往上
  • 注意找的是变量的当前状态

范例

例1

var a=1
function fn1() {
function fn2() {
console.log(a)
} function fn3() {
var a=4
fn2()
} var a=2
return fn3
} var fn=fn1()
fn() //输出多少
  • 执行过程分析

先执行 var a=1,var fn=fn1(),进入function fn1(),执行var a=2,return fn3,进入function fn3(),执行var a =4,fn2(),进入function fn2(),执行console.log(a),由于本作用域没有a,因此向上一级作用域寻找a,即var a=2,因此输出2。

 
例1 - 输出结果
 
例1 - debug

例2

var a=1
function fn1() {
function fn3() {
var a=4
fn2()
} var a=2
return fn3
} function fn2() {
console.log(a)
} var fn=fn1()
fn() //输出多少
  • 执行过程分析

执行var a=1,var fn=fn1(),进入function fn1(),执行var a=2,return fn3,执行function fn3(),执行var a=4,fn2(),执行function fn2(),执行console.log(a),此作用域没有a,所以向上一级作用域寻找a,即最外层的var a=1,因此输出结果1。

 
例2 - 输出结果
 
例2 - debug

例3

var a=1
function fn1() { function fn3() {
function fn2() {
console.log(a)
}
var a fn2()
a=4
}
var a=2
return fn3
}
var fn=fn1()
fn() //输出多少

先执行var a=1,var fn=fn1(),进入function fn1(),执行 var a=2 , return fn3,进入function fn3(),由于fn2()在var a=4之前,但var a会被前置,即等同于

var a
fn2()
a = 4

所以先执行var a,在执行fn2(),进入function fn2(),执行console.log(a),这个时候该作用域没有a,去上一层作用域找a,找到var a,但此时的a还没有赋值,因此输出undefined。

 
例3 - 输出结果
 
例3 - debug

JavaScript 作用域链范例的更多相关文章

  1. JavaScript作用域链的理解

    前言 作用域是JavaScript一个很重要的概念,想要学好JavaScript就需要理解javascript作用域和作用域链的工作原理.这篇文章对JavaScript作用域链和作用域链做一个简单的介 ...

  2. JavaScript 作用域链图具体解释

    <script type="text/javascript"> /** * 作用域链: */ var a = "a"; function hao94 ...

  3. JavaScript作用域链

    之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时 ...

  4. 个人理解的javascript作用域链与闭包

    闭包引入的前提个人理解是为从外部读取局部变量,正常情况下,这是办不到的.简单的闭包举例如下: function f1(){ n=100; function f2(){ alert(n); } retu ...

  5. javascript作用域链学习笔记

    作用域链 "JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里." --权威指南 在JavaScript中,一切皆对象,包括函数.函数对象和其它对象 ...

  6. (好文推荐)一篇文章看懂JavaScript作用域链

    闭包和作用域链是JavaScript中比较重要的概念,首先,看看几段简单的代码. 代码1: var name = "stephenchan"; var age = 23; func ...

  7. 深入javascript作用域链到闭包

    我之前用过闭包,用过this,虽然很多时候知道是这么一回事,但是确实理解上还不够深入.再一次看javascript高级程序设计这本书时,发现一起很多疑难问题竟然都懂了,所以总结一下一些理解,难免有错, ...

  8. 图解 javascript 作用域链

    还是之前那一段简单的javascript代码: window.onload=function(){ function sub(a,b){ return a-b; } var result=sub(10 ...

  9. JavaScript作用域(链)学习笔记

    作用域是javascript老生常谈的问题,在面试题中也经常出现.此文记录本人对js作用域的理解.从以下三个方面深入探讨js作用域和js作用域链. 1.什么是作用域? 2.什么是作用域链? 3.常见面 ...

随机推荐

  1. MVC身份验证Attribute简易版

    public class MemberValidationAttribute : AuthorizeAttribute { protected override bool AuthorizeCore( ...

  2. php源码建博客3--区分平台的MVC结构

    主要: 模型单例工厂 目录结构优化 区分平台(前台,后台....) --------------文件结构:-------------------------------------- blog├─Ap ...

  3. centos7环境下ELK部署之elasticsearch

    es部署:es只能用普通用户启动 博客园首发,转载请注明出处:https://www.cnblogs.com/tzxxh/p/9435318.html 一.环境准备: 安装jdk1.8.创建普通用户 ...

  4. BGP扩展属性

    安全特性: BGP安全特性: MD5 GTSM:通用TTL安全保护机制通过对TTL的检测来达到防止攻击的目的,如果攻击者模拟真实的BGP协议报文(TCP),对一台路由器不断地发送报文,路由器接收报文后 ...

  5. 论文翻译第二弹--用python(或Markdown)对论文复制文本进行处理

    图中这种论文你想进行文本复制放入翻译软件进行翻译时,会发现是这种形式: 句子之间是断开的,这时普遍的方法,也是我之前一直用的方法就是打开一个文档编辑器,复制上去后一行行地继续调整.昨天不想这样了,就打 ...

  6. Div标签使用inline-block有间距

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Redis系列化方式有哪些?哪个系列化性能最好?

    Redis系列化方式有JDK系列化.JSON系列化.XML系列化等多种.我专门测试过,在我的笔记本电脑上保存5万条User对象到Redis,JDK系列化方式平均要15秒,JSON系列化方式只要13秒多 ...

  8. QT Creator 转VS2017+QT工程

    因为刚学QT 不熟悉其QT Creator 的开发环境,所以打算用VS2017来开发,因为要跨平台所以打算写出来的代码可以放在linux上编译. 这时就需要将VS2017的工程转换成QT Creato ...

  9. PHP实现识别带emoji表情的字符串

    function have_special_char($str) { $length = mb_strlen($str); $array = []; for ($i=0; $i<$length; ...

  10. 成都优步uber司机第五组奖励政策

    7月14日,成都优步uber团队发布了第五组用户分组.在传言要推出第四组的时候,心想事不过三吧,意外,现在第五组都出来了.一起看看成都优步司机第五组的详细内容!滴滴快车单单2.5倍,注册地址:http ...