思维脑图+代码示例让作用域到作用域链的知识点一目了然!

思维脑图+代码示例让作用域到作用域链的知识点一目了然!

作用域

作用域的篇幅不会太长,作为自己对Js总结的第三篇文章,主要是承上启下。 之后会涉及到执行上下文,闭包等相关专题,为了避免内容过多,作用域这一部分单独总结。

目录

前言一、作用域的定义二、理解作用域三、作用域链四、思考与总结

五、写在最后

(免费学习推荐:javascript视频教程

前言

在这里插入图片描述

JavaScript内功系列:

this指向详解,思维脑图与代码的结合,让你一篇搞懂this、call、apply。系列(一)从原型到原型链,修炼JavaScript内功这篇文章真的不能错过!系列(二)本文

一、作用域的定义

一张导图概括本节内容

在这里插入图片描述

注意:除了作用域,在此送大家2020最新企业级 Vue3.0/Js/ES6/TS/React/Node等实战视频教程,点击此处免费获取,小白勿进哦

1.1 常见的解释

一段程序代码中所用到的名字并不总是有效,而限定它的可用性的范围就是这个名字的作用域;作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限;通俗的讲作用域就是一套规则,用于确定在何处以及如何查找某个变量的规则

function func(){var a = 100;console.log(a); // 100}console.log(a) // a is not defined a变量并不是任何地方都可以被找到的

登录后复制

1.2 JavaScript中作用域工作模型

JavaScript 采用是词法作用域(lexical scoping),也就是静态作用域:

函数的作用域在函数定义的时候就决定了

与之对应的还有一个动态作用域:

函数的作用域是在函数调用的时候才决定的;

1.3 全局变量和局部变量

根据定义变量的方式又可以分为:

局部变量:只能在函数中访问,该函数外不可访问;

定义在函数中的变量

function fn(){var name = '余光';console.log(name);}console.log(name); // ?fn(); // ?

登录后复制

全局:任何地方都能访问到的对象拥有全局作用域。

函数外定义的变量所有末定义直接赋值的变量自动声明为拥有全局作用域

var a = 100;console.log('a1-',a);function fn(){a = 1000;console.log('a2-',a);}console.log('a3-',a);fn();console.log('a4-',a);

登录后复制

注意:在ES6之后又提出了块级作用域,它们之间的区别我们之后再来讨论。

在这里插入图片描述

二、理解作用域

根据第一节的描述,我们一一验证一下

2.1 理解词法作用域

var value = 1;function foo() {    console.log(value);}function bar() {    var value = 2;    foo();}bar();

登录后复制

我们结合定义去分析:

执行bar函数,函数内部形成了局部作用域;声明value变量,并赋值2执行foo函数,函数foo的作用域内没有value这个变量,它会向外查找根据词法作用域的规则,函数定义时,foo的外部作用域为全局作用域打印结果是1

如果是动态作用域的话:结果就是2,不知道你是否想明白了?

2.2 全局变量

var str = '全局变量';function func(){console.log(str+1);function childFn(){console.log(str+2);function fn(){console.log(str+3);};fn();};childFn();}func();// 全局变量1// 全局变量2// 全局变量3

登录后复制

再来分析下面的代码:

var a = 100;function fn(){a = 1000;console.log('a1-',a);}console.log('a2-',a);fn();console.log('a3-',a);// a2- 100 // 在当前作用域下查找变量a => 100// a1- 1000 // 函数执行时,全局变量a已经被重新赋值// a3- 1000 // 全局变量a => 1000

登录后复制

2.3 局部作用域

局部作用域一般只在固定的代码片段内可访问到,最常见的就是以函数为单位的:

function fn(){    var name="余光";    function childFn(){        console.log(name);    }    childFn(); // 余光}console.log(name); // name is not defined

登录后复制

三、作用域链

3.1 当查找变量的时候都发生了什么?

会先从当前上下文的变量对象中查找;如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找;一直找到全局上下文的变量对象,也就是全局对象;作用域链的顶端就是全局对象;

这样由多个执行上下文的变量对象构成的链表就叫做作用域链,从某种意义上很类似原型和原型链。

3.2 作用域链和原型继承查找时的区别:

查找一个普通对象的属性,但是在当前对象和其原型中都找不到时,会返回undefined查找的属性在作用域链中不存在的话就会抛出ReferenceError。

3.3 作用域嵌套

既然每一个函数就可以形成一个作用域(词法作用域 || 块级作用域),那么当然也会存在多个作用域嵌套的情况,他们遵循这样的查询规则:

内部作用域有权访问外部作用域;外部作用域无法访问内部作用域;(真是是这样吗?)兄弟作用域不可互相访问;

在《你不知道的Js》中,希望读者可以将作用域的嵌套和作用域链想象成这样:

在这里插入图片描述

四、思考与总结

4.1 总结

在这里插入图片描述

4.2 思考

最后,让我们看一个《JavaScript权威指南》中的两段代码:

var scope = "global scope";function checkscope1(){    var scope = "local scope";    function f(){        return scope;    }    return f(); // 注意}checkscope1();var scope = "global scope";function checkscope2(){    var scope = "local scope";    function f(){        return scope;    }    return f;}checkscope2()();

登录后复制

两段代码的结果都是”local scope”,书中的回答是:JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。

但是它们内部经历的事情是一样的吗?

相关免费学习推荐:javascript视频教程

以上就是思维脑图+代码示例让作用域到作用域链的知识点一目了然!的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2716892.html

(0)
上一篇 2025年3月7日 21:59:34
下一篇 2025年2月18日 11:56:02

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 深入解析JavaScript中的作用域

    本篇文章带大家深入理解javascript作用域。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 这篇文章称为笔记更为合适一些,内容来源于 《你不知道的JavaScript(上卷)》第一部分 作用域和闭包。讲的很不错,非常…

    2025年3月7日
    200
  • 掌握JavaScript函数的嵌套和作用域

    掌握JavaScript函数的嵌套和作用域,需要具体代码示例 在JavaScript编程中,函数是非常重要的概念。函数的嵌套和作用域能够极大地提高代码的可读性和灵活性。本文将介绍如何正确地使用嵌套函数和作用域,并提供具体的代码示例。 函数的…

    2025年3月7日
    200
  • 编程中常见的闭包应用案例

    闭包在编程中的常见应用场景,需要具体代码示例 在编程中,闭包(Closure)是一种强大而常见的概念。它是指函数可以访问并操作其定义时的词法作用域内的变量。闭包可以在很多场景中发挥作用,下面将介绍几种常见的应用场景,并提供具体的代码示例。 …

    2025年3月7日
    200
  • 闭包的常见应用领域

    闭包的应用场景有哪些,需要具体代码示例 在编程中,闭包是一种强大的概念,它可以通过在函数内部创建另一个函数并返回它,实现对外部函数的变量和作用域的访问和控制。闭包的应用场景非常广泛,下面将介绍几个常见的应用场景,并提供具体的代码示例。 计数…

    2025年3月7日
    200
  • 重新绘制和重新排版的区别是什么

    重绘和回流是前端开发中经常遇到的两个概念,对于性能优化和页面渲染过程的理解非常重要。本文将介绍重绘和回流的区别,并提供一些具体的代码示例。 一、重绘(Repaint) 重绘是指当元素的外观发生改变,但没有影响其布局的情况下重新绘制元素的过程…

    2025年3月7日
    200
  • 哪些情况会导致闭包引起的内存泄漏

    闭包(Closure)是指一个函数(也称为内部函数)可以访问其外部函数的变量,即使在外部函数执行完成之后,内部函数仍然可以访问和操作外部函数的变量。闭包在编程中常常用于创建私有变量、实现柯里化(Currying)等功能。然而,不正确地使用闭…

    2025年3月7日
    200
  • js中new操作符工作原理是什么

    js中new操作符工作原理是什么,需要具体代码示例 js中的new操作符是用来创建对象的关键字。它的作用是根据指定的构造函数创建一个新的实例对象,并返回该对象的引用。在使用new操作符时,实际上进行了以下几个步骤: 创建一个新的空对象;将该…

    2025年3月7日
    200
  • 深入了解JavaScript const关键字

    JavaScript中const用法详解 JavaScript中,const是一个用来定义常量的关键字。与var和let不同,const定义的变量是不可以改变的,一旦定义了常量,就不能再对其进行赋值。本文将详细解释const的使用方式,并给…

    2025年3月7日
    200
  • JavaScript函数的用途

    JavaScript中function函数的作用 JavaScript是一种强大的脚本语言,而函数是其最基本、最重要的特性之一。函数既可以作为独立代码块调用,也可以作为其他代码的一部分。它可以接收参数,执行一系列的操作,并返回结果。本文将介…

    2025年3月7日
    200
  • 探讨JavaScript中var、let和const的使用和特性

    探究JavaScript中var、let和const的区别与优劣 在JavaScript中,变量的声明关键字有多种,最常用的是var、let和const。本文将探究它们之间的区别,并分析它们在不同场景下的优劣。 var 在ES5及以前的版本…

    2025年3月7日
    200

发表回复

登录后才能评论