作用域
变量或者函数可访问的一个范围,以函数来划分,一个函数块就是一个作用域
范围:不在其为,不谋其政
只有变量和函数有作用域
全局作用域
全局:整个文档
变量或者函数在函数外面声明,那它们就是全局变量和全局函数
全局的作用范围是整个文档,在这个页面任何地方都可以访问到它们
声明全局作用域的方法
1、变量或者函数放在函数外面声明
2、变量不用var声明,直接给变量赋值
不管它在函数内声明,还是在函数外声明
之所以全局变量在任何地方都可以访问到,是因为全局变量它是window下的属性
window是一个浏览器定义的全局对象,它本身在页面中任何位置都可以用,所以说全局变量可以在任何地方用
注意:尽量避免使用全局变量,声明变量的时候一定要加var;
可能把系统比如说window下面的系统自带的属性给覆盖了,那么就出问题了
局部作用域
局部:函数范围
变量或者函数是在函数内部声明的,它们的作用域仅存在于声明的这个函数里
函数(函数声明,不是函数调用)可以嵌套的,嵌套的函数(局部函数)可以访问父函数里的内容
声明局部作用域的方法(都在函数内声明):
var 变量;
function 函数名(){}
注意:局部变量与局部函数只能在声明它们的地方用,在其它的地方是用不到的
作用域链
变量与函数的查找规则
查找规则:
如果一个函数需要用到一个变量,那它会先在自己的作用域里去找这个变量。如果自己有那它就直接使用自己的,如果自己没有,那它就会一层一层往外找,直到找到外面的变量,找到后就用外面的变量
注意:作用域链会一层一层往外找,不会往里面找
预解析(声明前置)
函数或者变量都会有一个提前解析的过程,js会把函数或者变量提前解析一下,解析到它们对应的作用域最开始的位置
步骤
* 1、先找var 、function关键字以及参数
* 2、如果找到了var(声明的变量,参数),会给他赋一个undefined。如果找到了function,那它会把整个函数都拿过来
* 3、把找到的东西,放到对应的作用域的最开始的位置
* 4、逐行执行代码
函数预解析
1、函数声明
函数声明可以被预解析,所以可以先调用,再声明
2、函数表达式
函数表达式,不会被预解析,所以只能先声明再调用,不能把调用放在声明的前面(不然就报错)
闭包
闭包形成的环境:
函数嵌套函数;子函数访问父函数的变量
闭包的作用
让函数内的局部变量与局部函数,在外面可以访问到
为啥函数外面访问不到函数里面的局部变量和局部函数?
1.作用域
2.垃圾回收和生命周期(根本原因)
垃圾回收和生命周期
生命周期:变量或者函数在相应的作用域里存在的时间
局部变量的生命周期:不再使用了,就是生命周期的结束。局部亦是在函数内声明的,当函数执行完成以后,这个变量就不存在了
全局变量的生命周期:声明完成以后,在整个页面中都可以用。当页面关闭的时候,它的生命周期就结束了
垃圾回收机制
变量存在内存当中的,变量在使用完以后,没有在其它的地方再使用,就会被清除,用来释放内存。垃圾回收机制会按照固定的时间,周期性的执行