快速理解作用域
一提起作用域,好多初学js的小伙伴会觉得很蒙圈,这个大可不用担忧,只要肯用心,没有学不会的知识,废话不多说,进入正题,首先说一下什么是作用域:
一、作用域:
先举一个小例子来感受一下什么叫作用域,比如说小明是希望小学的一名学生,小花是希望小学一年级的一名学生,那么要找到小明这个人,我们先得确定一个区域范围,已经知道小明是希望小学的学生,那他肯定就在希望小学这个区域中,想对于小明来说,学校就是他的作用范围,要找到小明,我们只需要在他所在的作用域中去找就ok了;那要找到小花就更容易了,它不仅在希望小学这所学校,还知道她在一年级,也就是说一年级就是小花所在的作用范围。
在上面的例子中,希望小学是我们所提及到的最大的区域,可以看作是一个全局作用域,小明的范围锁定在学校,我们可以把小明看成是一个全局变量;一年级就是一个函数块,是全局作用域下的一个局部作用域,而小花就可以看作是一个局部变量。
作用域:变量的作用范围。
全局作用域:整个程序,从程序开始到结束。
局部作用域:函数体。
全局变量:在全局作用域中,变量都是有效的;在函数体的外部定义的变量都是全局变量;在函数体的内部没有var声明的变量,也有可能是全局变量。
局部变量:在局部作用域中,变量都是有效的;在函数内部明确使用var定义的变量或所有的形参;函数调用后,局部变量自动销毁。
function fn(){ var num = 10; } fn(); alert(num); //报错:num is not defined
上面这段代码为什么会报错呢?
我们在上面说过,函数调用后,局部变量自动销毁,当我们调用fn时,fn里的变量num会自动销毁,再输出num时,num已经被销毁,所以会报错。
在了解了基本定义后,总结一下如何解析作用域:
一、寻找:
var;
形参;
函数块;
二、逐行解析代码:
1.找表达式;
2.函数声明直接跳过(不调用不执行的原因);
3.函数调用;
为了加深理解,我们来看一些例子:
var num = 19; function fn(){ var num = 10; } fn(); alert(num); //19
原理:函数调用之后,局部变量自动销毁,所以输出的是全局变量num的值。
var num = 19; function fn(){ num = 10; } fn(); alert(num); //10
原理:当局部作用域中找不到var时,可以向它的父级全局作用域借,此时函数块里的局部变量就是全局变量19,因为给出num=10,所以将10赋给全局变量num,全局变量num=10,输出num=10.