函数和执行上下文

一.变量提升与函数提升

变量提升:通过var关键字定义(声明)的变量,在定义语句之前就可以访问到,只不过其值是undefined

函数提升:通过function声明的函数,在之前就可以调用,值是函数对象

var a=3
function fn(){console.log(a);var a=4;
};
fn();//undefined;
//使用var关键字变量提升了
//相当于 function fn(){var a;console.log(a);a=4;
};
//在函数作用域本身含有a,则不会去全局作用域查找
//变量提升
console.log(b);//undefined
var b=3;//函数提升
fun2();//可调用
function fun2(){console.log("fun2()");
};
fn3();//不能,这里使用了var关键字,所以重点是变量提升,而不是函数提升
var fn3=function(){console.log(3);
};

函数提升必须使用函数生命的方式

二.执行上下文

1.代码分类

全局代码、函数(局部代码)

2.全局执行上下文

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

(2)对全局数据进行预处理

  • var定义的全局变量==>undefined,添加为window的属性
  • function声明的全局函数==>赋值(fun),添加为window的方法
  • this==>赋值window

(3)开始执行全局代码

3.函数执行上下文

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

(2)对局部数据进行预处理

  • 形参变量==>赋值(实参)==>添加为执行上下文的属性
  • arguments==>赋值(实参列表),添加为执行上下文的属性
  • var定义的局部变量==>undefined,添加为执行上下文的属性
  • function声明的函数==>赋值(fun),添加为执行上下文的方法
  • this==>赋值(调用函数的对象)

(3)开始执行函数体代码

4.流程分析

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

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

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

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

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

tip:::

执行栈,也就是在其他编程语言中所说的“调用栈”,是一种拥有LIFO(后进先出)数据结构的栈,被用来存储代码运行时创建的所有执行上下文

引擎会执行那些执行上下文位于栈顶的函数。当该函数执行结束时,执行上下文从栈中弹出,控制流程到达当前栈中的一个上下文

let a = 'Hello World!';function first() {console.log('Inside first function');second();console.log('Again inside first function');
}function second() {console.log('Inside second function');
}first();
console.log('Inside Global Execution Context');

三.作用域

1.分类:

全局作用域、函数作用域、没有块作用域(ES6有了)

2.作用:隔离变量,不同作用域下同名变量不会有冲突

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为普通用户授权访问k8s资源(tls,rbac)

需求 为指定用户授权访问不同命名空间权限,例如:给新入职的员工zhangsan,添加权限,先给小的查询权限(default空间的pod读取权限),熟悉后,再给大的权限(所有的空间的pod的…

聊一聊如何在Vue中使用事件总线( Event Bus)进行组件间通信

事件总线模式允许不同的组件之间进行通信。它要求一个中央枢纽,组件可以通过它发送和接收事件,从而使组件之间的数据交换和交互更加顺畅。本文探讨了它的使用方法,以便开发人员能够充分利用它在Vue开发中的潜力。 跨通信是应用程序中组件之间…

STM32F4X定时器之基本定时器

一、定时器的概述 进行有规律的计数,每记一次数的时间都是固定的 定时器的本质:计数的总时间 记一次数的时间(时钟的频率) * 记多少次(重装载值)。 基本定时器属于片上外设,系统滴答定时器是…

GitHub下载太慢的解决方案

修改hosts文件: windows的hosts文件在 C:\Windows\System32\drivers\etc\hosts cmd管理员运行命令notepad C:\Windows\System32\drivers\etc\hosts 然后cmd命令重启网络ipconfig /flushdns windows修改hosts Ubuntu22.04修改hosts sudo vim /etc/hosts # This fil…

Java面试题-Java核心基础-第九天(泛型)

目录 一、泛型的理解 二、泛型的作用 三、泛型有哪些使用方式 四、上限、下限通配符的使用 五、泛型的原理 一、泛型的理解 泛型在jdk5中开始有的,泛型其实就是将类型进行参数话,使得类型在编译时就确定了,这种类型参数可以用在类、接口…

解决Docker安装MySQL不区分大小写问题

Docker安装MySQL忽略大小写问题的问题 连接MySQL: 查看当前mysql的大小写敏感配置 show global variables like %lower_case%; ------------------------------- | Variable_name | Value | ------------------------------- | lower_case_file_system …

openEuler 服务器安装 JumpServer (all-in-one 模式)

openEuler 服务器安装 JumpServer JumpServer 简介什么是 JumpServer ?JumpServer 的各种类型资产JumpServer 产品特色或优势JumpServer 符合 4A 规范 JumpServer 系统架构应用架构组件说明 JumpServer 安装部署环境要求网络端口网络端口列表防火墙常用命令 在线脚本…

LeetCode 414. Third Maximum Number【数组】简单

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

vlookup函数踩坑(wps)

使用wps的朋友看过来 vlookup函数踩坑,vlookup(查找值,查找范围,返回值的索引,精确查找or模糊查找) 我们要查找的数据的那一列,必须是查找范围的第一列! 案例,看下面的…

02、Python 字符串

目录 字符串的基础用法字符串包含引号字符串拼接获取用户输入长字符串原始字符串字节串字符串与字节串转换 字符串的基础用法 列字符串的内容几乎可以包含任何字符,英文字符也行,中文字符也行。 既可用单引号,也可用双引号 字符串包含引号…

shell的for循环与结构化

shell笔记 列表for循环不带列表for循环for循环举例1.例1 所有文件名大写替换为小写2. 例2 读取/etc/passwd文件,依次输出ip段3. 例3 读取/etc/hosts内容for循环,执行ping4. 例4 循环ip列表,输出对应编号5. 例5 批量添加用户 break1. 例1 brea…

C++ vector 的模拟实现

目录 1. vector 类的成员变量 2. 无参构造 3. 析构函数 4. size_t capacity() 5. size_t size() 6. void reserve(size_t n) 7. 迭代器 8. void push_back(const T& x) 9. T& operator[](size_t pos) 10. iterator insert(iterator pos, const T& val…

使用Redis发布订阅模式实现 Session共享

其实并不是实现session共享,而是通过redis的发布订阅,让所有集群的服务器,都让自己的session发送一下消息。比如说userId在第35台服务器上, 有100台服务器,那么第1台服务器收到消息,需要通知userId&#xf…

vue 组件封装 综合案例2

vue 组件封装 综合案例2 main.js import Vue from vue import App from ./App.vueVue.config.productionTip false//封装全局指令 focus Vue.directive(focus, {// 指令所在的dom元素,被插入到页面中时触发inserted(el) {el.focus();} })new Vue({render: h >…

MySQL 三大日志(bin log、redo log、undo log)

redo log redo log (重做日志) 是 InnoDB 存储引擎独有的,它让 MySQL有了崩溃恢复的能力,是事务中实现 持久化的重要操作 比如 MySQL 实例宕机了,重启时,InnoDB 存储引擎会使用 redo log 恢复数据,保证数据的持久性与…

设计模式——七大原则详解

目录 设计模式单一职责原则应用实例注意事项和细节 接口隔离原则应用实例 依赖倒转(倒置)原则基本介绍实例代码依赖关系传递的三种方式注意事项和细节 里氏替换原则基本介绍实例代码 开闭原则基本介绍实例代码 迪米特法则基本介绍实例代码注意事项和细节…

golang笔记17--编译调试go源码

golang笔记17--编译调试go源码 前置条件编译源码在 fmt 包中加自定义函数说明 当前go语言越来越流行了,各大厂商都有加大go工程师的需求,作为go语言的学习者,我们除了要了解如何使用go语言外,也有必要了解一下如何编译、调试go源码…

解决XXLJOB重复执行问题--Redis加锁+注解+AOP

基于Redis加锁注解AOP解决JOB重复执行问题 现象解决方案自定义注解定义AOP策略redis 加锁实践 现象 线上xxljob有时候会遇到同一个任务在调度的时候重复执行,如下图: 线上JOB服务运行了2个实例,有时候会重复调度到同一个实例,有…

交换机端口灯常亮 端口up状态 服务器设置ip交换机获取不到服务器网卡mac地址 不能通信

环境: 深信服防火墙 8.0.75 AF-2000-FH2130B-SC S6520X-24ST-SI交换机 version 7.1.070, Release 6530P02 问题描述: 交换机一个vlan下有3台服务器,连接端口2、3、4,2和3连接的服务器正常,交换机3端口灯常亮 端口up状态 服务器自动获取不了地址,改为手动设置ip后,交…

力扣labuladong——一刷day01

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、21. 合并两个有序链表二、力扣86. 分隔链表三、力扣23. 合并 K 个升序链表四、力扣删除链表的倒数第 N 个结点 前言 一、21. 合并两个有序链表 /*** Defin…