博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript/数据类型/function/作用域
阅读量:5930 次
发布时间:2019-06-19

本文共 1425 字,大约阅读时间需要 4 分钟。

原作者老师。目前为止看过最通俗易懂的作用域描述,特此截取部分方便查看理解

函数作用域

  • 定义

作用域(scope)指的是变量存在的范围。在 ES5 的规范中,Javascript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。ES6 又新增了块级作用域,本教程不涉及。

函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。

在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。

函数内部定义的变量,会在该作用域内覆盖同名全局变量。

var v = 1;function f(){  var v = 2;  console.log(v);}f() // 2v // 1

注意,对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。

if (true) {  var x = 5;}console.log(x);  // 5

上面代码中,变量x在条件判断区块之中声明,结果就是一个全局变量,可以在区块之外读取。

  • 函数内部的变量提升

与全局作用域一样,函数作用域内部也会产生“变量提升”现象。var命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部。

function foo(x) {  if (x > 100) {    var tmp = x - 100;  }}// 等同于function foo(x) {  var tmp;  if (x > 100) {    tmp = x - 100;  };}
  • 函数本身的作用域

函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是其声明时所在的作用域,与其运行时所在的作用域无关。

var a = 1;var x = function () {  console.log(a);};function f() {  var a = 2;  x();}f() // 1

上面代码中,函数x是在函数f的外部声明的,所以它的作用域绑定外层,内部变量a不会到函数f体内取值,所以输出1,而不是2。

总之,函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。

很容易犯错的一点是,如果函数A调用函数B,却没考虑到函数B不会引用函数A的内部变量。

var x = function () {  console.log(a);};function y(f) {  var a = 2;  f();}y(x)// ReferenceError: a is not defined

上面代码将函数x作为参数,传入函数y。但是,函数x是在函数y体外声明的,作用域绑定外层,因此找不到函数y的内部变量a,导致报错。

同样的,函数体内部声明的函数,作用域绑定函数体内部。

function foo() {  var x = 1;  function bar() {    console.log(x);  }  return bar;}var x = 2;var f = foo();f() // 1

上面代码中,函数foo内部声明了一个函数bar,bar的作用域绑定foo。当我们在foo外部取出bar执行时,变量x指向的是foo内部的x,而不是foo外部的x。正是这种机制,构成了“闭包”现象。


全文地址:

转载地址:http://riutx.baihongyu.com/

你可能感兴趣的文章
正则中需要转义的特殊字符
查看>>
CentOS安装教程(VMware)
查看>>
摄像头工作原理【转】
查看>>
【Zookeeper】源码分析之服务器(五)之ObserverZooKeeperServer
查看>>
Spring Cloud构建微服务架构(四)分布式配置中心
查看>>
Makefile学习之路——1
查看>>
《图解Spark:核心技术与案例实战》作者经验谈
查看>>
Yii使用笔记 2
查看>>
Ubuntu16.04下编译android6.0源码
查看>>
MySql批量插入数据
查看>>
微信开发-点击链接自己主动加入关注
查看>>
The Relationship Between Layers and Views
查看>>
算法笔记之动态规划
查看>>
2801 LOL-盖伦的蹲草计划
查看>>
GridView数据绑定控件的模版列时设置显示的格式
查看>>
mac下配置adb
查看>>
php利用curl获取网页title内容
查看>>
Maven插件的使用
查看>>
mOOC 编绎原理
查看>>
SVN版本库修改URL路径或者IP地址
查看>>