js作用域和闭包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hreticent/article/details/86773685

作用域

变量或者函数可访问的一个范围,以函数来划分,一个函数块就是一个作用域

范围:不在其为,不谋其政

只有变量和函数有作用域

全局作用域

  全局:整个文档

     变量或者函数在函数外面声明,那它们就是全局变量和全局函数

     全局的作用范围是整个文档,在这个页面任何地方都可以访问到它们

声明全局作用域的方法

     1、变量或者函数放在函数外面声明

     2、变量不用var声明,直接给变量赋值

        不管它在函数内声明,还是在函数外声明

扫描二维码关注公众号,回复: 5296245 查看本文章

     之所以全局变量在任何地方都可以访问到,是因为全局变量它是window下的属性

     window是一个浏览器定义的全局对象,它本身在页面中任何位置都可以用,所以说全局变量可以在任何地方用

 注意:尽量避免使用全局变量,声明变量的时候一定要加var;

   可能把系统比如说window下面的系统自带的属性给覆盖了,那么就出问题了

局部作用域

局部:函数范围

   变量或者函数是在函数内部声明的,它们的作用域仅存在于声明的这个函数里

   函数(函数声明,不是函数调用)可以嵌套的,嵌套的函数(局部函数)可以访问父函数里的内容

 

声明局部作用域的方法(都在函数内声明):

     var 变量;

     function 函数名(){}

注意:局部变量与局部函数只能在声明它们的地方用,在其它的地方是用不到的

作用域链

变量与函数的查找规则

查找规则:

如果一个函数需要用到一个变量,那它会先在自己的作用域里去找这个变量。如果自己有那它就直接使用自己的,如果自己没有,那它就会一层一层往外找,直到找到外面的变量,找到后就用外面的变量

注意:作用域链会一层一层往外找,不会往里面找

预解析(声明前置)

       函数或者变量都会有一个提前解析的过程,js会把函数或者变量提前解析一下,解析到它们对应的作用域最开始的位置

步骤

        *   1、先找var 、function关键字以及参数

        *   2、如果找到了var(声明的变量,参数),会给他赋一个undefined。如果找到了function,那它会把整个函数都拿过来

        *   3、把找到的东西,放到对应的作用域的最开始的位置

        *   4、逐行执行代码

函数预解析

1、函数声明

函数声明可以被预解析,所以可以先调用,再声明

2、函数表达式

函数表达式,不会被预解析,所以只能先声明再调用,不能把调用放在声明的前面(不然就报错)

闭包

闭包形成的环境:

函数嵌套函数;子函数访问父函数的变量

闭包的作用

  让函数内的局部变量与局部函数,在外面可以访问到

为啥函数外面访问不到函数里面的局部变量和局部函数?

1.作用域

2.垃圾回收和生命周期(根本原因)

垃圾回收和生命周期

生命周期:变量或者函数在相应的作用域里存在的时间

局部变量的生命周期:不再使用了,就是生命周期的结束。局部亦是在函数内声明的,当函数执行完成以后,这个变量就不存在了

全局变量的生命周期:声明完成以后,在整个页面中都可以用。当页面关闭的时候,它的生命周期就结束了

垃圾回收机制

 变量存在内存当中的,变量在使用完以后,没有在其它的地方再使用,就会被清除,用来释放内存。垃圾回收机制会按照固定的时间,周期性的执行

猜你喜欢

转载自blog.csdn.net/Hreticent/article/details/86773685