彻底理解作用域!

理解作用域##

结合上次的写的闭包,趁热打铁来讲讲作用域,希望有助于理解闭包和作用域。
作用域能决定了从代码不同部分对变量,对对象,对函数是否有可访问性。
在javascript 中作用域分为以:局部作用域 全局作用域(然后结合闭包,会提到链式作用域 )
顾名思义,局部作用域:就是在函数外部不能读取的变量,在函数内部去定义一个变量称局部变量,局部变量的作用域是局部的。

function btn(){
    
    
    var a ="1"
    console.log(a)//能取到
}
console.log(a)//不能取到

全局作用域:就是在函数外部能够读取到的变量,在函数外部定义的变量称为全局变量,全局变量的作用域是全局的。页面上所有脚本和函数都可以访问它。

var a ="1"
function btn(){
    
    
    console.log(a)//能取到
}
console.log(a)//能取到

注意:当你在函数内部没有使用var 定义了变量,此变量虽在函数内部,但也是全局变量,作用域也是全局的。如下

function btn(){
    
    
    a ="1"
    console.log(a)//能取到
}
console.log(a)//能取到

可能会问,在函数里定义了一个变量,那以这个变量到底能存活多久,什么时候才被销毁呢?
答:
局部变量:在函数开始时会创建局部变量,在函数执行完成时,会把这些局部变量销毁
全局变量:定义时生效,页面关闭时被销毁。
正因为如此:所以可以在不同的函数中,可以使用相同的变量名。
注意:作为函数 的参数(比如传参)其实也是属于函数内的变量=局部变量=作用域也是局部的。

说说链式作用域结构

其实所谓的链式作用域就是一种闭包的现象。
链式作用域结构,子项会一层一层向上去找所有父项定义的变量,所以父项所有的变量都是对子项开放的(子项都可以取到),而父项则不可拿子项的变量。
如下代码,a2函数被包含在a1函数中,a2函数可以拿到a1函数中的所有变量。但是a1拿不到a2函数中的变量。

function a1(){
    
    
    var w="10"
    function a2(){
    
    
        var y="20"
        console.log(w)//可以拿到
    }
    console.log(y)//拿不到
}

其实看上面的代码,在想想什么是闭包:一个外部函数内定义一个内部函数,
就是一种闭包的写法,那如果想外部函数可以拿到内部函数里定义的变量怎么解决?
上一个博客里也讲了解决方法,如下

function a1 (){
    
    
     var w3=10
     return function (){
    
    
       console.log("闭包3:",w3) 
     }
   }
  btn3()()

把内部函数当作一个匿名函数返回出去。
简单的讲了一下作用域,还是很好理解的,原创不易,希望看懂的友友给个支持给个关注~~~三克油啦。

—努力努力再努力!

猜你喜欢

转载自blog.csdn.net/weixin_47679798/article/details/109346226