广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >实例详解JavaScript静态作用域和动态作用域
  • 722
分享到

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

2024-04-02 19:04:59 722人浏览 泡泡鱼
摘要

目录前言 静态作用域与动态作用域 静态作用域执行过程 动态作用域执行过程 习题 习题一 习题二 习题三 总结 前言 在文章最开始,先学习几个概念: 作用域:《你不知道的j

前言

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

  • 作用域:《你不知道的js》中指出,作用域是一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找。简单来说,作用域规定了如何查找变量。
  • 静态作用域:又称词法作用域,函数的作用域在函数定义的时候就决定了,通俗点说就是你在写代码时将变量和块作用域写在哪里决定的。
  • 动态作用域:函数的作用域在函数调用时才决定的。

静态作用域与动态作用域

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

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


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

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

上面代码中:

  • 我们首先定义全局变量 val,赋值为 1
  • 声明一个函数 text,函数的功能是打印 val 这个变量的值
  • 声明一个函数 bar,函数内部定义局部变量 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()

上面代码中:

  • 我们首先定义全局变量 a,赋值为 1
  • 声明一个函数 fn1,函数的内部分别声明了函数 fn3,定义局部变量 a,赋值为 2,返回值为 fn3 函数
  • fn3 函数内部定义局部变量 a,赋值为 4,执行 fn2()
  • 声明函数 fn2, 函数的功能是,打印 a 的值
  • fn 赋值为 fn1() 的返回值
  • 执行 fn() (相当于执行 fn3 函数)

做题之前,一定要理解 静态作用域 的概念。该题 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静态作用域和动态作用域内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 实例详解JavaScript静态作用域和动态作用域

本文链接: https://www.lsjlt.com/news/155324.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 实例详解JavaScript静态作用域和动态作用域
    目录前言 静态作用域与动态作用域 静态作用域执行过程 动态作用域执行过程 习题 习题一 习题二 习题三 总结 前言 在文章最开始,先学习几个概念: 作用域:《你不知道的j...
    99+
    2022-11-12
  • JavaScript中怎么实现静态作用域和动态作用域
    这篇文章将为大家详细讲解有关JavaScript中怎么实现静态作用域和动态作用域,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JavaScript采用的是词...
    99+
    2022-10-19
  • javascript作用域和作用域链详解
    目录一、javascript的作用域1、全局作用域2、局部作用域二、javascript的作用域链三、作用域链和优化四、改变作用域链1、with语法改变作用域链2、catch语法总结...
    99+
    2022-11-13
  • 详解JavaScript作用域
    这篇文章主要介绍“详解JavaScript作用域”,在日常操作中,相信很多人在详解JavaScript作用域问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”详解JavaScri...
    99+
    2022-10-19
  • JavaScript全局作用域和函数作用域实例分析
    本篇内容介绍了“JavaScript全局作用域和函数作用域实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2022-10-19
  • Python作用域用法实例详解
    本文实例分析了Python作用域用法。分享给大家供大家参考,具体如下: 每一个编程语言都有变量的作用域的概念,Python也不例外,以下是Python作用域的代码演示: def scope_test()...
    99+
    2022-06-04
    详解 实例 作用
  • JavaScript块级作用域绑定以及状态提升详解
    目录前言作用域/执行上下文var 声明块级声明不声明的变量1. 不使用关键字声明变量2. 使用 var 声明的变量var 声明和块级声明的区别全局作用域绑定状态提升块级绑定的最佳实践...
    99+
    2022-11-13
  • JavaScript作用域和作用域链的示例分析
    这篇文章给大家分享的是有关JavaScript作用域和作用域链的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。作用域(Scope)1. 什么是作用域作用域是在运行时代码中...
    99+
    2022-10-19
  • Javascript的作用域、作用域链以及闭包详解
    一、javascript中的作用域 ①全局变量-函数体外部进行声明 ②局部变量-函数体内部进行声明 1)函数级作用域 javascript语言中局部变量不同于C#、Java等高级语言...
    99+
    2022-11-13
  • JavaScript作用域实例分析
    这篇文章主要讲解了“JavaScript作用域实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript作用域实例分析”吧!  ...
    99+
    2022-10-19
  • js词法作用域与this实例详解
    目录前言实践总结前言 静态作用域又叫做词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区...
    99+
    2022-11-13
  • JavaScript中变量的作用域详解
    一、变量的分类 在JavaScript中变量分为两种: 全局变量局部变量 二、变量的作用域 1、局部变量的作用域 局部变量:在函数内部定义的变量称为局部变量,其作用域为该函数内部,在...
    99+
    2022-11-13
  • JavaScript详细解析之作用域链
    以上就是JavaScript详细解析之作用域链的详细内容,更多请关注编程网其它相关文章!...
    99+
    2022-11-22
    JavaScript 前端
  • JavaScript循环作用域实例分析
    本篇内容主要讲解“JavaScript循环作用域实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript循环作用域实例分析”吧! 循环作用域...
    99+
    2022-10-19
  • 代理模式:JAVA静态代理和动态代理的实例和实现详解
    目录前言静态代理实现简述创建human接口创建接口实现类创建针对接口实现增强操作的代理代理实现效果动态代理实现简述要点:向上转型创建YoungMan接口创建两个接口实现类创建动态代理...
    99+
    2022-11-12
  • JavaScript进阶知识点作用域详解
    目录JavaScript进阶讲解一一、浏览器的内核1.常见的浏览器内核二、JavaScript引擎2.1.为什么需要JavaScript引擎?2.2.常见的JavaScript引擎三...
    99+
    2022-11-13
  • JavaScript的变量作用域实例分析
    这篇文章主要讲解了“JavaScript的变量作用域实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript的变量作用域实例分析”吧!1.变量作用域的分析首先,我们先研究一...
    99+
    2023-06-29
  • js中作用域和作用域链及预解析的示例分析
    小编给大家分享一下js中作用域和作用域链及预解析的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!变量---->局部...
    99+
    2022-10-19
  • 免费动态域名解析服务器的作用是什么
    免费动态域名解析服务器的作用是将动态IP地址与域名进行绑定,使得用户可以通过域名来访问动态IP地址所对应的服务器或设备,而不需要记住...
    99+
    2023-06-12
    免费动态域名解析 域名
  • Unity3D 单例模式和静态类的使用详解
    Unity3D的API提供了很多的功能,但是很多流程还是会自己去封装一下去。当然现在网上也有很多的框架可以去下载使用,但是肯定不会比自己写的用起来顺手。 对于是否需要使用框架的问题上...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作