彻底理解作用域!

彻底理解作用域!

技术杂谈小彩虹2021-08-21 16:32:41190A+A-

理解作用域##

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

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

---努力努力再努力! 前端交流群(866270649)分享知识,共同进步。

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们