美文网首页
Js基础知识-作用域和自由变量

Js基础知识-作用域和自由变量

作者: 小恐龙yaya | 来源:发表于2020-04-16 18:33 被阅读0次

作用域

一个思考题

  • 点击生成的标签a的时候提示的是什么?
   let i, a
    for (i = 0; i < 10; i++) {
      a = document.createElement('a')
      a.innerHTML = i + '<br/>'
      a.addEventListener('click', function (e) {
        e.preventDefault()
        alert(i)
      })
      document.body.appendChild(a)
    }

带着这个问题我们来看一下作用域和自由变量。

作用域

一张图带你认知作用域。


作用域.png
  • a 可以在红色框任意地方使用,a1可以在蓝框任意地方使用,a2可以再黄框任意地方使用,a3可以再黑框任意地方使用。
  • 如果翻过来,在红框内,黑框外使用a3就会报错。
    所以就会得到变量对应的使用范围,这个范围就叫做作用域

作用域有哪些?

  1. 全局作用域
    上述例子中 变量a就是全局作用域,在任意地方都可以使用。
  2. 函数作用域
    函数作用就是只能在当前函数中使用,例如a1只能在fn1中使用,超出就不能使用。
  3. 块级作用域
    块级作用域只能在当前的块中使用,超出当前块就会报错,例如以下例子。
    if (true) {
      let x = 100
    }
    console.log(x) // x is not defined

使用var声明遍历会造成变量提升,所以建议在写代码时尽量使用let,const

关于var的变量提升,如果刚才块级作用域简单修改一下,打印的值就不一样,原因就是因为把声明a提升到了最顶部,之后赋值。

    if (true) {
      var x = 100
    }
    console.log(x) // 100

变量提升后,这样看的话就会一目了然。

    var a
    if (true) {
      x = 100
    }
    console.log(x) // 100

自由变量

  • 一个变量在当前作用域没有定义,但是他被使用了 。
  • 他会向上级作用域进行寻找,一层一层逐渐往上,直到找到为止。
  • 如果全局作用域都没有找到,就会提示XX is not defined。


    作用域.png

    还是这个图,使用a2是就向上层找,找到了a2,a1在上上层找到了,a在全局作用域找到。那么这些变量就叫做自由变量。
    回到刚开始的问题,实践的答案就是每次点击都是10,那么如何解决这个问题,只需要把变量i的定义改变为块级作用域就可以解决。

   let  a
    for (let i = 0; i < 10; i++) {
      a = document.createElement('a')
      a.innerHTML = i + '<br/>'
      a.addEventListener('click', function (e) {
        e.preventDefault()
        alert(i)
      })
      document.body.appendChild(a)
    }

相关文章

  • 5-1 从基础知识到JSWebAPI

    回顾js基础知识 JS-web-API 总结 回顾js基础知识 变量类型和计算 原型和原型链 闭包与作用域 异步和...

  • 变量作用域

    变量作用域:静态作用域、动态作用域JS变量作用域:JS使用静态作用域JS没有块级作用域(全局作用域、函数作用域等)...

  • JS基础知识:变量对象、作用域链和闭包

    JS基础知识:变量对象、作用域链和闭包 前言:这段时间一直在消化作用域链和闭包的相关知识。之前看《JS高程》和一些...

  • Js基础知识-作用域和自由变量

    作用域 一个思考题 点击生成的标签a的时候提示的是什么? 带着这个问题我们来看一下作用域和自由变量。 作用域 一张...

  • JS-Web-Api

    JS基础知识,规定语法(ECMA262标准); 变量类型和计算 原型和原型链 作用域和闭包 异步和同步 JS We...

  • 6.js-Web-API-DOM、BOM

    js基础知识:基于ECMA 262标准(规定基础语法、规则) --变量类型和计算--原型和原型链--闭包和作用域-...

  • JavaScript作用域的理解

    作用域:就是起作用的区域。JS的作用域规定了变量和函数可访问的范围。JS作用域分为:全局作用域和局部作用域 全局作...

  • JavaScript 函数闭包(colsure)

    理解闭包,你首先必须理解JS的变量作用域,JavaScript作用域和作用域链。 ES6之前,变量的作用域分为全局...

  • 2018-08-03

    js作用域和作用域链 什么是作用域 ⼀个变量的作⽤域是程序源代码中定义这个变量的区域。对象, 函数也是变量。作...

  • JS 作用域链、导入导出

    1. JS 的作用域链 作用域在 JS 中表示变量的可访问性和可见性。JS 作用域有 3 种:1. 全局作用域;2...

网友评论

      本文标题:Js基础知识-作用域和自由变量

      本文链接:https://www.haomeiwen.com/subject/rgulvhtx.html