【进击的JavaScript|高薪面试必看】JS基础-作用域和闭包

news/2024/5/16 0:56:30/文章来源:https://blog.csdn.net/qq_37215621/article/details/126800197

六年代码两茫茫,不思量,自难忘
6年资深前端主管一枚,只分享技术干货,项目实战经验,面试指导
关注博主不迷路~

在这里插入图片描述
本系列文章是博主精心整理的面试热点问题,吸收了大量的技术博客与面试文章,总结多年的面试经历,带你快速建立前端面试知识体系。抓住每一场面试的机会,知己知彼才能百战百胜。
希望各位同学收藏起来哦!!

  • 上期回顾 JS基础—原型和原型链
  • 本系列订阅 面试指导专栏

文章目录

  • 本期介绍
  • 主要内容
  • 关键字
    • 什么是作用域?
    • 什么是自由变量?
    • 什么是闭包?
    • 闭包会用在哪里?
    • this 有几种赋值情况
    • 手写call、apply、bind
    • 补充 - 原型中的 this


本期介绍

本期介绍作用域和闭包的知识点和题目。包括作用域,自由变量,闭包,this 等部分。作用域是 “JS 三座大山” 之二,不知道闭包的话,面试通过概率不大。

主要内容

  • 什么是作用域?什么是自由变量?
  • 什么是闭包?闭包会用在哪里?
  • this 有几种赋值情况

关键字

  • 作用域
  • 闭包
  • this

什么是作用域?

变量合法的使用范围
在这里插入图片描述

  • 全局作用域: 在全局都可以使用
  • 函数作用域: 只能在当前函数内使用
  • 块级作用域(ES6新增): if,for,while语法里
// ES6 块级作用域
if (true) {let x = 100
}
console.log(x) // 会报错

什么是自由变量?

  • 一个变量在当前作用域没有定义,但被使用了
  • 向上级作用域一层一层依次寻找,直到找到为止
  • 如果到全局作用域都没找到,则报错 xx is not defind

什么是闭包?

作用域应用的特殊情况,指有权访问另一个函数作用域中的变量的函数

有两种情况:

  1. 函数作为参数被传递
  2. 函数作为返回值被返回
// 函数作为返回值
function create() {let a = 100return function () {console.log(a)}
}
let fn = create()
let a = 200
fn()
// 函数作为参数
function print(fn) {let a = 200fn()
}
let a = 100
function fn() {console.log(a)
}
print(fn)

注意: 所有自由变量的查找是在函数定义的地方,向上级作用域查找,不是在执行的地方

闭包会用在哪里?

  • 场景一:采用函数引用方式的setTimeout调用
  • 场景二:回调
  • 场景三:函数防抖
  • 场景四:封装私有变量
    实际开发中闭包多用于隐藏数据 ,只提供API进行修改数据

this 有几种赋值情况

  1. 作为普通函数被调用,指向的是window
  2. 使用call、apply、bind 可以改变this的指向
    apply和call会让当前函数立即执行,而bind会返回一个函数,后续需要的时候再调用执行
    在这里插入图片描述
  3. 作为对象的方法被调用,指向当前对象
  4. 在class方法中调用,指向当前创建的实例constructor
  5. 箭头函数中的this永远是取他上级作用域的this
    在这里插入图片描述
    注意:this取什么值是在函数执行的时候确定的,不是在函数定义的时候确定的

手写call、apply、bind

  1. 手写call
function myCall() {const content = [].shift.call(arguments) || window;content.fn = this;const result = content.fn(...arguments);delete content.fn;return result;
}
Function.prototype.myCall = myCall;
fn.myCall(obj, 'arg1', 'arg2');  // {a: '这是obj'}
  1. 手写apply
function myApply() {const content = [].shift.call(arguments) || window;content.fn = this;const result = content.fn(...arguments[0]);delete content.fn;return result;
}
Function.prototype.myApply = myApply;
fn.myApply(obj, ['arg1', 'arg2']);  // {a: '这是obj'}
  1. 手写bind
function myBind() {const content = [].shift.call(arguments) || window;content.fn = this;const args = arguments;return () => {const result = content.fn(...args);delete content.fn;return result;}
}
Function.prototype.myBind = myBind;
fn.myBind(obj, 'arg1', 'arg2')();  // {a: '这是obj'}

示例:

const obj = {a: '这是obj'};
function fn(arg1, arg2) {console.log(this);
}
fn.call(obj, 'arg1', 'arg2'); // {a: '这是obj'}
fn.apply(obj, ['arg1', 'arg2']); // {a: '这是obj'}
fn.bind(obj, 'arg1', 'arg2')(); // {a: '这是obj'}

原理:

  • 3个方法第一个参数为新的执行环境,所以是一个对象
  • 将当前执行环境赋值给新环境的某个属性
  • 使用新环境调用当前执行环境,相当于一个对象调用方法,方法的this就是这个对象
  • 新环境是一个对象所以为引用类型,新增一个属性会改变自身,所以调用之后获得结果需要删除新增的属性

补充 - 原型中的 this

在这里插入图片描述
注:此原型图解可对照JS基础—原型和原型链中class 实现继承定义的类理解

解释:
直接xiaoluo。sayhai,调用对象是xiaoluo,所以this是能找到的
用__proto__原型去访问的话,调用对象是__proto__,所以name和number是未定义的

✨原 创 不 易 , 还 希 望 各 位 支 持
👍 点 赞 , 你 的 认 可 是 我 创 作 的 动 力
⭐️ 收 藏 , 你 的 青 睐 是 我 努 力 的 方 向
✏️ 评 论 , 你 的 意 见 是 我 进 步 的 财 富

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

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

相关文章

Java毕设项目——网上宠物店管理系统(java+SSM+Maven+Mysql+Jsp)

文末获取源码 开发语言:Java 框架:SSM 技术:Jsp JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&#xff1a…

收银台——Web自动化测试

目录 一,收银台项目的主要功能: 二,Web自动化测试 一,Web自动化测试,设计测试用例 二,编写测试用例代码 三,测试结果: 四,总结: 一,收银台项…

JVM监控:JMX组件与底层原理

JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架 ,从Java5.0开始引入到标准Java技术平台中。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。 其实JMX也可以看作一个框架&a…

一建报名重大变动 部分专业考生2022年不能报名一级建造师考试?

2022年度一级建造师资格考试报名证明事项实行告知承诺制,应试人员须通过中国人事考试网的全国专业技术人员资格考试报名服务平台进行网上注册、报名和缴费。 云南报名时间:2022年9月14日—9月21日;缴费截止时间:9月14日—9月23日…

【Android】App开发-控件篇

App开发是一个工作量比较大的项目,要学习App开发首先我们要先去学习手机中的各类工具和信息是怎么运行的,我们可以使用哪些工具来对手机进行设置。这里我采用的开发工具是Android studio。 目录 Textview控件 文本框控件: 阴影/模糊度控件…

第12章 软件测试基础 12.1-软件测试 12.2-验证与确认 12.3-软件缺陷

目录 一、软件测试基础主要内容 二、软件测试 1、软件测试的定义 2、软件测试的对象 3、软件测试的目的 4、考点 (1)软件测试的目的 (2)软件测试的对象 三、验证与确认 1、验证(Verification) 2、确认&…

pycharm安装opencv-python报错

嘿嘿,大家好,我又遇到拦路的小可爱了! 报错内容 3): Read timed out. WARNING: You are using pip version 21.3.1; however, version 22.2.2 is available. You should consider upgrading via the E:\daimabao\python\bigdata\Scripts\pyt…

【小月电子】安路国产FPGA开发板系统学习教程-LESSON7串口通信

串口通信例程讲解若要观看该博客配套的视频教程,可点击此链接根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤。比如非常简单的项目,我们可以省去虚线框里面的…

【数据结构】二叉树的遍历

文章目录 5.3 二叉树的遍历 5.3.1 概述 5.3.2 遍历方式【重点】 5.3.3 遍历方式:递归实现【重点】 5.3.4 遍历方式:非递归实现 5.3 二叉树的遍历 5.3.1 概述 二叉树的遍历:沿着某条搜索路径对二叉树中的结点进行访问,使得每…

grpc|protobuf的安装、编译、运行笔记(C++)

一、下载grpc源码 如果你的电脑/服务器可以做代理,然后稳定链接上 GitHub 那么完全可以按照 GitHub 的官方文档来操作,我这里采用 Gitee 镜像来操作 git clone https://gitee.com/jiangxy__loey/grpc.git二、下载依赖库 进入grpc目录,然后…

为什么残差连接的网络结构更容易学习?

为什么残差连接的网络结构更容易学习? 【写在前面】 不仅仅在resnet中,在各种网络结构中大家都喜欢使用残差连接的设计,并声称这有利于网络的优化,这是为什么呢?能给出一个有说服力的答案吗? Why the re…

1.数据校验-拦截器-全局异常-json数据处理

目录 1.数据校验-拦截器-全局异常-json数据处理 1. JSR303 2. JSR303中含有的注解 3. spring中使用JSR303进行服务端校验 3.1 导入依赖包 3.2 添加验证规则 3.3执行校验 3.4 错误信息的展示 4. SpringMVC定义Restfull接口 5.1 增加spring配置 5.2 Controller 5.3 格…

Mstsc(远程桌面连接)命令的高级用法

Mstsc远程桌面连接,这个是微软操作系统自带的一个命令,相信很多人都用过,但是如果说这个命令还有高级用法,估计很多人都没有用过,其实这个命令还是很强大的,今天咱们就来说一下mstsc的高级用法Mstsc远程桌面连接,这个是微软操作系统自带的一个命令,相信很多人都用过,但…

20220912--CSP-S模拟4

A. 石子游戏 B. 大鱼吃小鱼 C. 黑客 D. 黑客-续A. 石子游戏 首先了解一个叫做 \(\operatorname{Nim}\) 游戏的玩意 通常的 \(\operatorname{Nim}\) 游戏的定义是这样的: 有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)” 如果轮…

自制操作系统日志——第十二天

自制操作系统日志——第十二天 从今天开始,我们将花费两天的时间来进行计算机中定时器的制作。有了定时器后,才能够为程序和cpu更加便利的进行计时。可能会稍难一些了!!! 做好准备,冲!&#xf…

ConcurrentLinkedQueue解析

概述 ConcurrentLinkedQueue实际对应的是LinkedList,是一个线程安全的无界队列,但LinkedList是一个双向链表,而ConcurrentLinkedQueue是单向链表。ConcurrentLinkedQueue线程安全在于设置head、tail以及next指针时都用的cas操作,而且node里的…

00Android studio安装

目录一.下载Android studio二.安装Android studio三.打开软件一.下载Android studio 官网:https://developer.android.google.cn/studio 下载:由于是国外的网站,国内下载会比较慢 二.安装Android studio 打开: 点击【Next】 点击…

猿创征文|瑞吉外卖——管理端_员工管理

个人名片: 博主:酒徒ᝰ. 专栏:瑞吉外卖 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:一本好书,就像高级武功秘籍一样,哪怕只是从里面领悟到个一招半势&…

C# StringBuilder 底层深入原理分析以及使用详解

目录前言什么是StringBuilderStringBuilder的成员StringBuilder增加元素原理StringBuilder扩容原理Capacity:1,元素数量:0Capacity:1,元素数量:1Capacity:2,元素数量:2Ca…

开学季征文|卷生卷死之新学期大学生自救指南!!!

你好,这里是前情提要 正所谓 “ 宁可卷死自己,也要卷死同学 ” ,在这个万物皆卷的时代,“卷”似乎早已与我们变得不可分割血脉相融,有道是卷卷更健康。我也知道卷卷更好,可是天不遂人愿,因为疫情…