前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java作用域-什么是JavaScript作用域、作用域链?

java作用域-什么是JavaScript作用域、作用域链?

作者头像
囍楽云
发布2022-12-29 11:19:10
1.9K0
发布2022-12-29 11:19:10
举报
文章被收录于专栏:囍楽云博客

作用域、作用域链也是面试中出镜率很高的问题之一java作用域java作用域,同时也是中最重要的基础概念之一。

  今天我们将通过最简单实际的代码来展示函数作用域和全局作用域,在下篇文章中,我们将介绍块级作用域和暂时性死区。

  作用域基本知识

  简单来说,作用域就是用来规定变量的作用范围的,在任何语言当中都会有作用域的概念,在ES6以前,只有函数作用域和全局作用域,ES6之后又增加块级作用域。

  函数作用域和全局作用域

  函数作用域非常简单,比如,执行下面的foo函数,变量a在函数foo的作用域内,所以在函数内可以正常的访问该变量,输出bar

   function foo() {

代码语言:javascript
复制
      var a = 'bar'
      console.log(a)
    }
    
    foo()

  对上面代码稍做改动,如下

   var a = 'bar'

代码语言:javascript
复制
    function foo() {
      console.log(a)
    }
    foo()

  执行上面代码时,foo函数在自身的作用域并未找到变量a,但是它还是会向外层扩大范围查找,于是在全局作用域找到了变量a,输出bar

  继续对代码进行修改,如下

   function bar() {

代码语言:javascript
复制
      var b = 'bar'
    }
    function foo() {
      console.log(b)
    }
    
    foo()

  上面代码,foo和bar两个函数拥有彼此独立的函数作用域,所以在foo函数中也无法访问bar函数中定义的变量b,其作用域链中(直到最上层的全局作用域中)也并不存在变量b,所以代码会报错 : b is not

  简单来说就是,在执行某个函数时,如果需要取某个变量的值,就会就近首先在函数内查找变量是否声明赋值,如果函数内无法找到该变量,就跳出当前函数作用域,到上层作用域中进行查找,这里的上层作用域可能是也是一个函数作用域,也可能是全局作用域。

  下面来看一个更具体的示例

   function bar() {

代码语言:javascript
复制
      var b = 'bar'
      function foo() {
        console.log(b)
    
      }
      foo()
    }
    bar()

  在bar函数内的foo函数执行时,变量b不存在于foo函数内,所以就近在其上层函数bar作用域内寻找,所以最终输出bar

  再来看另外一个示例

   var b = 'bar'

代码语言:javascript
复制
    function bar() {
    
      function foo() {
        console.log(b)
      }
      foo()
    }
    bar()

  执行上面的代码仍然会输出bar,因为执行foo函数时,foo内并未找到变量b,就近在上层bar函数内也未找到,于是最终在全局作用内找到变量b。变量作用域就是这样一层一层相套的关系,逐层寻找,这也就是被称之作用域链的原因。

  在下篇文章中,我们将介绍块级作用域和暂时性死区的相关内容。

本文共 678 个字数,平均阅读时长 ≈ 2分钟

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档