文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

实例详解JavaScript静态作用域和动态作用域

2024-04-02 19:55

关注

前言

在文章最开始,先学习几个概念:

静态作用域与动态作用域

JavaScript采用的是静态作用域,函数定义的位置就决定了函数的作用域。

具体看一个例子,理解一下什么是静态作用域与动态作用域的区别


var val = 1;
function test() {
    console.log(val);
}
function bar() {
    var val = 2;
    test();
}

bar();
// 结果是???

上面代码中:

静态作用域执行过程

当执行 test 函数时,先从 test 函数内部查找是否有变量 val,如果没有,就沿定义函数的位置,查找上一层的代码,查找到全局变量 val ,其值为 1。

作用域查找始终从运行时所处的最内层作用域开始查找,逐级向外查找,直到遇见第一个匹配的标识符为止。

无论函数在哪里被调用,无论如何被调用,它的作用域只由函数定义所处的位置决定。

动态作用域执行过程

执行 test 函数,首先从函数内部查询 val 变量,如果没有,就从调用函数的作用域,即 bar 函数的作用域内部查找变量 val,所以打印结果 2

习题

我们来看三个习题,好好消化理解一下静态作用域: 函数定义位置就决定了作用域。

习题一


var a = 1
function fn1(){
    function fn3(){
        var a = 4
        fn2()
    }
    var a = 2
    return fn3
}
function fn2(){
    console.log(a)
}
var fn = fn1()
fn()

上面代码中:

做题之前,一定要理解 静态作用域 的概念。该题 fn2 定义在全局上,当 fn2 中找不到变量 a 时,它会去全局中寻找,与 fn1 和 fn3 毫无关系,打印 1.

习题二


var a = 1
function fn1(){
    function fn2(){
        console.log(a)
    }
    function fn3(){
        var a = 4
        fn2()
    }
    var a = 2
    return fn3
}
var fn = fn1()
fn()

fn2 是定义在函数 fn1 内部,因此当 fn2 内部没有变量 a 时,它会去 fn1 中寻找,跟函数 fn3 毫无关系,如果 fn1 中寻找不到,会到 fn1 定义的位置的上一层(全局)寻找,直至寻找到第一个匹配的标识符。本题可以在 fn1 中找到变量 a,打印 2

习题三


var a = 1;
function fn1(){
    function fn3(){
        function fn2(){
            console.log(a)
        }
        var a;
        fn2()
        a = 4
    }
    var a = 2
    return fn3
}
var fn = fn1()
fn()

该题 fn2 定义在函数 fn3 中,当 fn2 中找不到变量 a 时,会首先去 fn3 中查找,如果还查找不到,会到 fn1 中查找。本题可以在 fn3 中找到变量 a,但由于 fn2() 执行时,a 未赋值,打印 undefined。

总结

关于JavaScript 的静态作用域,我们只需要记住一句话:函数定义的位置就决定了函数的作用域,遇到题目时不要被别的代码干扰到。

到此这篇关于JavaScript静态作用域和动态作用域的文章就介绍到这了,更多相关JS静态作用域和动态作用域内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯