彻底理解作用域!

理解作用域##

结合上次的写的闭包,趁热打铁来讲讲作用域,希望有助于理解闭包和作用域。
作用域能决定了从代码不同部分对变量,对对象,对函数是否有可访问性。
在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()()

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

—努力努力再努力!

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值