作用域

作用域是指程序源代码中定义变量的区域。

作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。

JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。

静态作用域与动态作用域

因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。

而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。

让我们认真看个例子就能明白之间的区别:

var value = 1;function foo() {console.log(value);
}function bar() {var value = 2;foo();
}bar();// 结果是 ???
复制代码

假设JavaScript采用静态作用域,让我们分析下执行过程:

执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。

假设JavaScript采用动态作用域,让我们分析下执行过程:

执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。

前面我们已经说了,JavaScript采用的是静态作用域,所以这个例子的结果是 1。

动态作用域 也许你会好奇什么语言是动态作用域?

bash 就是动态作用域,不信的话,把下面的脚本存成例如 scope.bash,然后进入相应的目录,用命令行执行 bash ./scope.bash,看看打印的值是多少。

value=1
function foo () {echo $value;
}
function bar () {local value=2;foo;
}
bar
复制代码

思考题

最后,让我们看一个《JavaScript权威指南》中的例子:

var scope = "global scope";
function checkscope(){var scope = "local scope";function f(){return scope;}return f();
}
checkscope();
var scope = "global scope";
function checkscope(){var scope = "local scope";function f(){return scope;}return f;
}
checkscope()();
复制代码

猜猜两段代码各自的执行结果是多少?

这里直接告诉大家结果,两段代码都会打印:local scope。

原因也很简单,因为JavaScript采用的是词法作用域,函数的作用域基于函数创建的位置。

而引用《JavaScript权威指南》的回答就是:

JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。

转载于:https://juejin.im/post/5b978bd26fb9a05d3447a233

JavaScript之词法作用域和动态作用域相关推荐

  1. JavaScript词法作用域和动态作用域

    2019独角兽企业重金招聘Python工程师标准>>> 作用域 作用域是指代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前代码执行对变量的访问权限 JavaScrip ...

  2. 深入学习js之——词法作用域和动态作用域

    开篇 当我们在开始学习任何一门语言的时候,都会接触到变量的概念,变量的出现其实是为了解决一个问题,为的是存储某些值,进而,存储某些值的目的是为了在之后对这个值进行访问或者修改,正是这种存储和访问变量的 ...

  3. 一文搞懂:词法作用域、动态作用域、回调函数、闭包

    把以前一直只限于知道,却不清晰理解的这几个概念完完整整地梳理了一番.内容参考自wiki页面,然后加上自己一些理解. 词法作用域和动态作用域 不管什么语言,我们总要学习作用域(或生命周期)的概念,比如常 ...

  4. 词法作用域和动态作用域

    JavaScript采用的是词法作用域 1.词法作用域 即函数定义时,即确定的作用域.js中的作用域链,在函数声明时候,就已经确定了,无论函数在何处调用,其作用域变量的查找都是按照定义是包含关系去查找 ...

  5. 静态作用域与动态作用域的区别(转)

    在计算机程序设计中,变量是名字(name)与实体(entity)的绑定(binding).一段程序代码中所用到的名字并不总是有效(或者说:可用的),而限定这个变量名字具有可用性的代码范围就是这个名字的 ...

  6. 你不知道的JavaScript之词法作用域

    词法作用域 总结一下作用域的定义:作用域就是一套规则,这套规则用于引擎如何进行查找变量以及在哪找到变量(可以看看之前我博客写的引擎和作用域之间的对话). 作用域分为词法作用域(也叫静态作用域)和动态作 ...

  7. 关于JavaScript的词法作用域及变量提升的个人理解

    关于JavaScript的作用域,最近听到一个名词:"词法作用域":以前没有听说过(读书少),记录一下对此的理解,加深印象. 词法作用域:在JavaScript中,一个函数的作用域 ...

  8. Web前端学习笔记——JavaScript之数组、函数、作用域

    数组 为什么要学习数组 之前学习的数据类型,只能存储一个值(比如:Number/String.我们想存储班级中所有学生的姓名,此时该如何存储? 数组的概念 所谓数组,就是将多个元素(通常是同一类型)按 ...

  9. JavaScript重难点解析4(作用域与作用域链、闭包详解)

    JavaScript重难点解析4(作用域与作用域链.闭包详解) 作用域与作用域链 作用域 作用域与执行上下文 作用域链 闭包 闭包理解 将函数作为另一个函数的返回值 将函数作为实参传递给另一个函数调用 ...

最新文章

  1. halcon与QT联合:(5.4)瓶盖检测以及QT界面搭建
  2. Python+pandas计算数据相关系数(person、Kendall、spearman)
  3. R语言赋值操作符:<−、<<-、=、->、->>、:、%in%、%*%
  4. 网站推广——专业网站推广浅析企业网站排名有哪些影响因素?
  5. java 编写代码_Java 7:如何编写非常快速的Java代码
  6. 以编程方式访问Java基本类型的大小
  7. 区块链跟银行有什么关系?
  8. html广告悬浮窗口,JS实现悬浮移动窗口(悬浮广告)的特效
  9. 超火AI变脸特效来袭!马云蔡徐坤一起《吗咿呀嘿》 网友:摇不能停
  10. ISP图像调试工程师——3D和2D降噪(熟悉图像预处理和后处理技术)
  11. MyEclipse或Eclipse中工程的导入和导出
  12. 服务器缺少dll文件,遇到DLL文件缺失或者损坏怎么办 DLL文件修复教程
  13. 提交代码到gitbub.com
  14. Linux下tftp服务器/客户端安装
  15. java计算机毕业设计springboot+vue青少年编程在线考试系统
  16. python“~”符号的用法
  17. (滁院20级计科专用)期末考试复习-操作系统
  18. 豆豉烘干技巧有哪些,只用下列步骤烘干就行了
  19. python笔迹识别_笔迹鉴别(1) —— 实现步骤概述
  20. Microsoft Office 全家桶下载地址

热门文章

  1. python3.5安装-Linux:Python3.5安装和配置
  2. 学python最好的方式-自学Python有什么好方法吗?老男孩专业Python培训
  3. Intel深度摄像头RealSense D345(实感双目摄像头)和目标检测结合使用
  4. 东大18秋计算机网络在线作业1答案,东大17秋学期《计算机网络基础》在线作业3 免费答案...
  5. usb网络linux系统安装教程,Linux系统入门学习:如何在树莓派上安装USB网络摄像头...
  6. 为何要fork()两次来避免产生僵尸进程?
  7. 排好序的数组中,找出两数之和为m的所有组合
  8. Django 2版本
  9. HDU3068 最长回文
  10. mysql sleep连接过多的问题解决