变量的作用域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了变量的作用域相关的知识,希望对你有一定的参考价值。

  一:变量的作用域----通俗点就是在哪里可以找到这个变量,即源码中定义这个变量的区域。

    变量的作用域有全局作用域和局部作用域(函数作用域)

      ----全局作用域中定义的变量在任何地方都是有定义的,都能访问

      ----区别于c、c++等花括号就能确定一个局部作用域(块级作用域),js中没有块级作用域而是用函数作用域来代替:变量在声明他们的函数体以及这个函数体嵌套的任意函数体内都是有定义      的。

      ----三点注意:

        1).局部变量优先,在函数体内,局部变量的优先级高于 同名的全局变量

  

var scope="global scope";
function checkscope(){
   var scope="local scope";
   return scope;        
}

checkscope();    // local scope

         2).在函数内声明变量时,不使用var则会当做全局变量处理

<script type="text/javascript">
		var a=1;
		function b(){
			c=2;
			return c;
		}
		alert(a);	//1
		alert(b());	//2
		alert(c);	//2
	</script>

         3).JavaScript函数作用域是指函数体内声明的所有变量在函数体内始终是可见的,意味着在声明之前甚至已经可用---JavaScript 称这个为“声明提前”,即JavaScript函数里声明的        所有变量都被提前到函数顶部,不过变量的初始化留在了原来的位置。

  二:词法作用域

    JavaScript变量都是有词法作用域的----俗称执行上下文(环境)

      当程序运行到变量所在的作用域时,变量被创建。这是需要一个空间来存储这些变量,而JavaScript中提供存储空间的数据结构就叫环境,词法作用域是在定义创建的时候决定的而不是在   执行的时候决定的。

  三:作用域链

    1)每一段JavaScript代码(全局代码或函数)都有一个与之关联的作用域链。这个作用于链是一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量

    2)当JavaScript需要查找x的值得时候(变量解析),他会从链中的第一个对象开始查找,若有则返回x,若无则查找下一个对象,直到顶层对象。

    3)在JavaScript顶层代码中,作用域链由一个全局对象组成。在不包含嵌套函数体内,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象。

    4)当定义一个函数时,它实际上保存一个作用域链。当调用这个函数时,它创建一个新对象来保存它的局部变量,并保存至那个作用域链上,同时创建一个更长的表示函数调用作用域的“链”

    以上面的词法作用域作为基础,JavaScript是基于词法作用域的语言。

 

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

JS---闭包

Bash的变量类型

JavaScript 作用域 与 作用域链

Python - 模块

JavaScript ES6 的let和const

JS 作用域及作用域链