函数作用域及作用域链
Posted xcyzkh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数作用域及作用域链相关的知识,希望对你有一定的参考价值。
变量作用域
全局作用域
在javascript中全局变量的作用域比较简单,它的作用域是全局的,在代码的任何地方都是有定义的。然而函数的参数和局部变量只在函数体内有定义
1.函数外面定义的变量拥有全局作用域
var n =2; function fn() var a= 1; return a; console.log(fn())//1 console.log(n)//2 console.log(a)//报错 error
2未定义直接赋值的变量自动声明为拥有全局作用域
var n =2; function fn() a= 1; return a; console.log(fn())//1 console.log(n)//2 console.log(a)//1
3.window对象的属性拥有全局作用
局部作用域
局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所以在一些地方会把这种作用域成为函数作用域。
图一中,a是函数内部声明并赋值,拥有局部作用域,只能带函数fn内部使用,在fn外部使用就会报错,这就是局部作用域的特性,外部无法访问。
3ES6的块级作用域
ES5只有全局作用域和函数作用域,没有块级作用域,会带来下面问题:
ES6引入了块级作用域,明确允许在块级作用域中声明函数,let和const命令都涉及块级作用域。
作用域链
函数的作用域实际上是个动态概念 只有函数调用时,才会在内存中动态开辟一个自己的作用域,函数调用完了这个作用域又关闭了,函数运行过程中在内存创建的数据又被清除了
通俗地讲,当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。
1.当执行函数时,总是先从函数内部找寻局部变量
2.如果内部找不到(函数的局部作用域没有),则会向创建函数的作用域(声明函数的作用域)寻找,依次向上
以上是关于函数作用域及作用域链的主要内容,如果未能解决你的问题,请参考以下文章