美文网首页
第二章 词法作用域

第二章 词法作用域

作者: Epat | 来源:发表于2020-08-26 09:57 被阅读0次
image.png

初看这段代码感觉不太能理解,如果按照词法作用域来看,bar函数所在的词法作用域为foo,那么在定义时,是没有i这个变量的,那么i = 3 应该是找到window上的。
但是其实词法作用域只是指的当函数在运行时,函数所在的作用域是在那个位置,而不是运行时,去找函数定义时作用域所处的状态。
也就是说foo函数在运行到for循环时,已经在foo这个作用域上增加了 i 这个变量,这样运行bar这个函数时,在bar这个函数词法作用域foo中,由于存在了i这个变量,当bar函数中给i赋值,相当于给foo这个作用域上的i赋值。
我们可以思考如下这段代码

    function bar (a) {
            i = 3;
    }
    function foo () {
        for (var i = 0; i < 10; i++) {
            console.log(i)
            bar(i * 2)
        }
    }
    foo()
    console.log(i)

这个时候bar的词法作用域在全局上了,所以当设置 i = 3时,改变的并不是foo作用域中的i,而是会在LHS寻址上找不到i变量,并在全局上创建一个i变量。
所以在ES5 中使用let来定义,可以让i变量只存在于for循环这个块级作用域中,当然我这里表述可能不太正确,但差不多就是这个意思,参考如下代码

function foo () {
    function bar (a) {
            i = 3;
    }
    for (let i = 0; i < 10; i++) {
        console.log(i)
        bar(i * 2)
    }
}
foo()
console.log(i)

其实对于作用域或者函数来说,主要作用其实就是封装和复用吧。让变量在比较多的情况下不至于污染全局,少很多重复代码,如果没有函数的话其实代码也能写,只是没有现在这么优雅而已

相关文章

  • YOU DON'T KNOW JS 笔记 2

    第二章 词法作用域 词法作用域是定义在词法阶段的作用域 由写代码时将变量和块作用域写在哪里决定 全局变量会自动成为...

  • 词法作用域&动态作用域

    词法作用域(静态作用域) 词法作用域也叫静态作用域,jsvascript为词法作用域。词法作用域关心的是你的函数申...

  • 词法作用域

    我们知道JavaScript并不具有动态作用域,它只有词法作用域,什么是词法作用域? 一、 词法作用域 词法作用域...

  • 2.词法作用域

    JavaScript的作用域模型采用的是词法作用域 词法阶段 查找 欺骗词法作用域 既然词法作用域完全由编写时来决...

  • js中的作用域

    作用域就是决定变量有效范围 作用域按决定的时期来区分可分为词法作用域和动态作用域词法作用域: 词法作用域就是作用域...

  • JS基础-作用域与闭包

    1.理解词法作用域和动态作用域 词法作用域:定义在词法阶段的作用域换言之,词法作用域是由你在写代码时将变量和块作用...

  • 你不知道的JavaScript:词法作用域

    词法作用域 简单的说,词法作用域就是定义在词法阶段的作用域。词法作用域就是由你写代码时将变量和块作用域写在哪里来决...

  • 2、词法作用域

    词法作用域 简单地说,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写...

  • 词法作用域

    作用域工作模式:1 词法作用域;2 动态作用域(Bash脚本、Perl中的一些模式) 2.1 词法阶段 词法作用域...

  • 你不知道的 Javascript

    作用域 词法作用域:编译阶段确定(欺骗词法作用域 eval with) 块作用域 with try/catch l...

网友评论

      本文标题:第二章 词法作用域

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