美文网首页
一个例子理解作用域(var/let)

一个例子理解作用域(var/let)

作者: 你喜欢吃青椒吗_c744 | 来源:发表于2019-07-28 23:13 被阅读0次

var的时候

<script>
        for (var i = 0; i < 5; i++) {
            setTimeout(function () {
                console.log(i);
            }, i * 1000);
            console.log(' i : ', i)
        } 
</script>

因为setTimeout是异步的事件。所以会先执行for的循环。

console.log('i:',i)

console.log('i:',i)因为在for的作用域内部,所以可以循环打印出i

循环之后,就要执行setTimeout了。
此时会输出:

输出5个5

这是为什么呢?为什么不会输出 0,1,2,3,4呢?

  • 因为var,尽管var在for里面声明了i,但是var会把i泄露为全局变量。所以,循环结束不会保存0,1,2,3,4。只保存了保存5
  • 接着再执行setTimeout,这个函数的作用域里没有声明i,所以会沿着作用域链向上寻找上一级的i。发现了全局作用域的i。此时的 i = 5,所以直接把5拿到并且5次输出。

在for外面添加console.log(i)

    <script>
        for (var  i = 0; i < 5; i++) {
            setTimeout(function () {
                console.log(i);
            }, i * 1000);
            console.log(' i : ', i)
        } 
        console.log(i)
   </script>

结果输出一个5。其实上面已经说了,var会把i泄露为全局变量。所以,循环结束不会保存0,1,2,3,4。只保存了保存5console.log(i)里的i会先寻找本作用域的i,所以输出5

let的时候

    <script>
        for (let   i = 0; i < 5; i++) {
            setTimeout(function () {
                console.log(i);
            }, i * 1000);
            console.log(' i : ', i)
        } 
        // console.log(i)
    </script>

var换成let,let会生成一个局部的作用域。每循环一次,它就产生一个作用域。

image.png
所以,除了正常的循环打印出console.log(' i : ', i)外,setTimeout里面还会循环打印出0,1,2,3,4来。

在for外面加上一个console.log(i)

<script>
        for (let   i = 0; i < 5; i++) {
            setTimeout(function () {
                console.log(i);
            }, i * 1000);
            console.log(' i : ', i)
        } 
        console.log(i)
    </script>

会报错:i is not definded。因为for有它自己的作用域。而console.log(i)是处于另外一个作用域。

相关文章

  • 变量声明与闭包

    变量声明 var let const 闭包 子作用域被返回到父作用域,就会形成闭包,例子: 注意一个例子: 更多例...

  • let const

    var let const var:是全局作用域 可以重复声明 let:局部变量(局部作用域) 在一个作用...

  • js面试题

    1、let、var、const区别 1、作用域不同,var是函数作用域,而let是块作用域2、 let不能在定义之...

  • ES6-let & const

    一. let与var let 是块级作用域;var 是函数级作用域。 二. let 与 const let与con...

  • var、let 和 const

    关键字 var、let 和 const 表示变量作用域,其中var 表示函数作用域,let 表示块作用域,cons...

  • let var const 区别是什么

    举个例子 let是块记作用域 var 全局作用域 const 修饰是常量。 引用网址https://www.jia...

  • sample

    一、var与let JS中的块级作用域,var、let、const三者的区别 var是函数级作用域,没有块级作用域...

  • 1.块级作用域

    let与var区别 1.let为块级作用域,通过{}进行作用域设置var为词法作用域,并且只能通过function...

  • ES6

    ①const和let var 只有 全局作用域 和 函数作用域 没有块级作用域 { }let 、 const...

  • ES6语法规范---摘抄自阮一峰大大的书

    块级作用域 (1)用let代替var,var有变量提升,而let没有 var声明相当于全局变量,let有块级作用域...

网友评论

      本文标题:一个例子理解作用域(var/let)

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