02_变量提升与函数提升及其优先级(JS高级)

目录

一、 变量提升与函数提升

为什么要进行变量提升和函数提升

1.1 变量提升 

1.2 函数提升

1.3 变量提升与函数提升的优先级

二、执行上下文

三、执行上下文栈

四、习题


一、 变量提升与函数提升

为什么要进行变量提升和函数提升

JS引擎在读取js代码的过程中,分为两步。第一个步骤是整个js代码的解析读取,第二个步骤是执行。在JS代码执行之前,浏览器的解析器在遇到 var 变量名 和function 整个函数 提升到当前作用域的最前面。

在ES6出来之前,JS并没有块级作用域这一说,只有全局作用域和局部作用域。变量提升指的是使用var声明的变量提升到他所在的作用域的最顶端。 

1. 变量声明提升

* 通过var定义(声明)的变量, 在定义语句之前就可以访问到

* 值: undefined

2. 函数声明提升

* 通过function声明的函数, 在定义之前就可以直接调用

* 值: 函数定义(对象)

3. 问题: 变量提升和函数提升是如何产生的?

1.1 变量提升 

console.log(a)   //undefined
var a='我是谁'
console.log(a)   //'我是谁'


它的过程就相当于

var a;
console.log(a);
a='我是谁'
console.log(a)

1.2 函数提升

函数提升只针对具名函数(用function 声明的函数),而对于赋值的匿名函数,并不会存在函数提升。

console.log(a);    // f a()
console.log(b);    //undefined     

function a(){
    console.log('hello')
}

var b = function(){
    console.log('world')
}



它的过程就相当于:

var a = function (){
    console.log('hello')
}
var b;

console.log(a);   
console.log(b);

1.3 变量提升与函数提升的优先级

函数提升优先级高于变量提升,且不会被同名变量声明覆盖,但是会被变量赋值后覆盖。而且存在同名函数与同名变量时,优先执行函数。

下面这道题真的很有水准:

console.log(a);      
console.log(a()); //1

var a = 1;
function a(){
    console.log(1);
}
console.log(a);       //1   
a = 3
console.log(a())      //Uncaught TypeError: a is not a function


它的过程就相当于:

var a = function (){   //声明一个变量a指向function函数
    console.log(1)
}

var a; 

console.log(a) // 1 a优先执行函数
console.log(a());



a = 1    //这里变量赋值后覆盖同名函数,a此时是变量且值为1
console.log(a) // 1

a = 3
console.log(a()) // 3

二、执行上下文

1. 代码分类(位置)

* 全局代码

* 函数(局部)代码

2. 全局执行上下文

* 在执行全局代码前将window确定为全局执行上下文

* 对全局数据进行预处理

* var定义的全局变量==>undefined, 添加为window的属性

* function声明的全局函数==>赋值(fun), 添加为window的方法

* this==>赋值(window)

* 开始执行全局代码

3. 函数执行上下文

* 在调用函数, 准备执行函数体之前, 创建对应的函数执行上下文对象(虚拟的, 存在于栈中)

* 对局部数据进行预处理

* 形参变量==>赋值(实参)==>添加为执行上下文的属性

* arguments==>赋值(实参列表), 添加为执行上下文的属性

* var定义的局部变量==>undefined, 添加为执行上下文的属性

* function声明的函数 ==>赋值(fun), 添加为执行上下文的方法

* this==>赋值(调用函数的对象)

* 开始执行函数体代码

    console.log(a1, window.a1)
    window.a2()
    console.log(this)

    var a1 = 3
    function a2() {
      console.log('a2()')
    }
    console.log(a1)

    //函数执行上下文
    function fn(a1) {
      console.log(a1);// 2
      console.log(a2);// undefined
      a3() // a3()执行了
      console.log(this) // window 因为调用函数的对象为window
      console.log(arguments);//伪数组 Arguments(2) [2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]

      var a2 = 3

      function a3() {
        console.log('a3()执行了');
      }
    }

    fn(2, 3) //调用函数的对象为window

三、执行上下文栈

1. 在全局代码执行前, JS引擎就会创建一个栈来存储管理所有的执行上下文对象

2. 在全局执行上下文(window)确定后, 将其添加到栈中(压栈)

3. 在函数执行上下文创建后, 将其添加到栈中(压栈)

4. 在当前函数执行完后,将栈顶的对象移除(出栈)

5. 当所有的代码执行完后, 栈中只剩下window

练习题1:  

  var a = 10
  var bar = function (x) {
    var b = 5
    foo(x + b)
  }
  var foo = function (y) {
    var c = 5
    console.log(a + c + y)
  }
  bar(10) // 30 

练习题2: 

    console.log('gb:' + i);

    var i = 1
    foo(1)

    function foo(i) {
      if (i == 4) {
        return
      }
      console.log('gb:' + i);
      foo(i + 1);// 递归调用: 在函数内部调用自己
      console.log('fe:' + i);
    }

    console.log('ge:' + i);

 输出结果:

四、习题

习题1:


    function a() { }
    var a
    console.log(typeof a) // 'function'

 // 浏览器一上来就会先把函数预编译了,也就是函数提升定义a为函数,然后a又被赋值成了undefined但是不会覆盖之前的函数,所以a是函数了

习题2: 

    function a() { }
    var a = 1
    console.log(typeof a) // 'Number'
 // 浏览器一上来就会先把函数预编译了,也就是函数提升定义a为函数,然后a又被赋值成了1覆盖了之前的函数,所以a是Number类型

习题3:


    if (!(b in window)) {
      var b = 1
    }
    console.log(b) // undefined

习题4:

 /*
     浏览器一上来就会先把函数预编译了,也就是函数提升定义c为函数,然后c又被赋值成了1,所以再调用c时c已经不是函数了,所以报错
     函数的提升比变量优先级高,但是如果变量赋值,函数就会被覆盖
     */
    var c = 1
    function c(c) {
      console.log(c)
    }
    console.log(c); // 1
    c(2) // 报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/660455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dinky MySQLCDC 整库同步到 Doris

资源:flink 1.17.0、dinky 1.0.2、doris-2.0.1-rc04 问题:Cannot deserialize value of type int from String ,detailMessageunknowndatabases ,not a valid int value 2024-05-29 16:52:20.136 ERROR org.apache.doris.flink.…

OpenAI开始训练新的前沿模型——但GPT-5至少在90天内不会推出

ChatGPT 制造商 OpenAI 今早宣布,已开始训练其新的“前沿模型”,并成立了一个新的安全委员会,由现任董事会成员 Bret Taylor(OpenAI 董事会主席兼客户服务初创公司 Sierra AI 联合创始人、前谷歌地图负责人和前 Facebook 首席技术…

DNSlog环境搭建

阿里云域名公网VPS地址 购买阿里云域名后设置“自定义DNSHOST” DNS服务器填写ns1和ns2 如:ns1.aaa.com IP地址填写你的VPS地址 如:1.1.1.1 填写解析记录,一个A记录、一个NS记录 NS记录就是*.域名指向记录值ns1.域名 如:*.aaa…

JVM之加载class文件

1.JVM相关概念 官网地址:Java Platform Standard Edition 8 Documentation (oracle.com) jvm: java虚拟机,是java程序的运行环境(java二进制字节码的运行环境) jre:jvm基础类库(java.lang包下工具类、IO、集合类库、线程类等)组成了完整的运行环境 jdk:是由jvmj…

ElementUI之el-table标题列中显示el-tooltip

ElementUI之el-table标题列中显示el-tooltip 文章目录 ElementUI之el-table标题列中显示el-tooltip1. el-table标题列中显示el-tooltip2. 实现代码3. 展示效果 1. el-table标题列中显示el-tooltip 在el-table-column标签内添加具名插槽v-slot:header 在el-tooltip标签中使用具…

AI企业需要“联盟营销”?一文带你探索AI企业营销新玩法!

为什么联盟营销对AI业务有较大优势 联盟营销在电商领域、saas领域与其他产品领域同样有效。在AI业务中,它有效的原因与其他领域大不相同。 高好奇心和试用率 AI领域是创新的热点。它吸引了一群渴望探索和尝试每一项新技术的人群。这种蓬勃的好奇心为聪明的AI企业提…

NTP服务的DDoS攻击:原理和防御

NTP协议作为一种关键的互联网基础设施组件,旨在确保全球网络设备间的时钟同步,对于维护数据一致性和安全性至关重要。然而,其设计上的某些特性也为恶意行为者提供了发动大规模分布式拒绝服务(DDoS)攻击的机会。以下是NTP服务DDoS攻击及其防御…

34岁嵌入式开发工程师的出路在哪儿?

作为一个从事智能穿戴行业11年的资深从业者,您积累了丰富的技术和经验,IT行业内有很多发展机会和出路可以选择,以下是一些建议供参考:刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到…

uniapp开发vue3监听右滑返回操作,返回到指定页面,解决边缘区域监听错误问题

想要在uniapp框架中监听左滑或者右滑手势,需要使用touchstart和touchend两个api,因为没有原生的左右滑监听api,所以我们只能依靠这两个api来获取滑动开始时候的x坐标和滑动结束后的x坐标做比对,右滑的话,结束时候的x坐…

gitea的git库备份与恢复

文章目录 gitea库的备份与恢复概述笔记实验环境更新git for windows更新 TortoiseGit备份已经存在的gitea的git库目录使用gitea本身来备份所有git库目录将gitea库恢复到新目录m1m2m3启动gitea - 此时已经恢复完成FETCH_HEAD 中有硬写位置再查一下app.ini, 是否改漏了。m1m2 总结…

pytorch深度学习-环境搭建-2

1.1下载cudnn,解压 1.2.找到本级cuda安装路径 1.3.刚才解压文件复制到cuda安装目录 2.1 安装pytouch conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia 3.pytouch验证 我这儿是有问题的 PS C:\Users\Administrator\PycharmProjects\pyth…

BGP路由策略实验

一、实验拓扑 二、IP分配(骨干) R1: 0/0/0 15.0.0.1 24 0/0/1 18.0.0.2 24 0/0/2 19.0.0.1 24 R2: 0/0/0 16.0.0.1 24 0/0/1 15.0.0.2 24 R3: 0/0/0 17.0.0.2 24 0/0/1 18.0.0.1 24 R4: 0/0/0 16.0…

怎么将3D模型转换立面图---模大狮模型网

在建筑设计、室内设计以及产品建模等领域,经常需要将3D模型转换为立面图以进行展示、分析或交流。立面图能够清晰地呈现物体的外观和结构,是设计和施工中不可或缺的一部分。 一、导出3D模型 首先,需要将3D模型导出为CAD软件能够识别的格式。…

零基础学习图生图

目录 一、图生图是什么二、安装秋叶整合包2.1 秋叶包安装2.2 秋叶包拓展安装:2.3 ckpt配置:2.4 界面常用功能配置: 三、图生图基本功能展示3.1 图生图的界面3.2 重要的参数设置:3.3 涂鸦功能3.4 局部重绘功能3.5 涂鸦重绘3.6 上传…

microk8s 报错tls: failed to verify certificate: x509:

问题: ssh命令出现如下图所示 输入任何microk8s的容器命令几乎都是x509报错 kubectl get pods -ALL 原因: 证书过期 相关文档: MicroK8s - 服务和端口 Microk8S v1.24 - refresh-certs 似乎无法刷新证书 问题 #3241 规范/microk8s Git…

二叉树介绍及堆

文章目录 树 概念及结构 二叉树 概念及结构 特殊的二叉树 完全二叉树 满二叉树 性质 储存 顺序存储 链式储存 堆 概念及结构 小堆 大堆 建堆 向上调整建堆 向下调整建堆 TOPK问题 法一: 法二: 树 概念及结构 树是一种非线性的数据…

[图解]企业应用架构模式2024新译本讲解02-表数据入口

1 00:00:00,420 --> 00:00:04,330 这个案例,我们就是用书上的案例了 2 00:00:06,080 --> 00:00:08,860 收入确认的一个案例 3 00:00:09,510 --> 00:00:11,100 书上讲了,收入确认 4 00:00:13,330 --> 00:00:15,270 就是说,你给…

5月岚庭工人大会“安全就是效率、形象即是品质”

2024年5月18日、19日岚庭一月一期的“产业工人大会”和“工程大会”圆满举行初夏正当时,此次大会主要围绕“安全”与“形象”展开六场专题培训只为精益求精产业工人和装修管家全体到场。 岚庭 以绝对【安全】护家护园 安全就是生命,违章就是事故&#x…

Javaweb基础之Filter

大家好,这里是教授.F 引入: 为什么需要过滤器???我们在访问一个项目的时候,常常有很多页面,如果没有过滤器,则我们需要在用户访问一个页面的时候,都要进行一个校验&…

OrangePi AIpro 快速上手初体验——接口、样例和目标检测

​ 一、 开发板简介 OrangePi AIpro开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇腾 AI 处理器,可提供 8TOPS INT8 的计算能力,内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算,可…