函数作用域及作用域链

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.如果内部找不到(函数的局部作用域没有),则会向创建函数的作用域(声明函数的作用域)寻找,依次向上

 

以上是关于函数作用域及作用域链的主要内容,如果未能解决你的问题,请参考以下文章

JS 作用域及作用域链

JavaScript作用域及作用域链详解声明提升

JavaScript函数函数进阶作用域及预解析

JS 闭包

关于Javascript作用域及作用域链的总结

函数作用域及函数表达式