新闻详情

新闻详情

首页 / 资讯中心 / 详情

this、call、apply、bind

发布时间:2026/11/4 18:27:50来源:尧图网络
this、call、apply、bind
这是前端面试几乎必问的一组问题也是JavaScript this 机制的核心。一、this 到底是什么一句话this 不是函数定义时决定的而是函数调用时决定的。箭头函数除外例如functionfn(){console.log(this);}fn();// window浏览器非严格模式obj.fn();// objnewfn();// 新创建的对象fn.call(a);// a谁调用this 一般就指向谁。二、this 的绑定规则面试必答this 一共有5 种绑定方式。① 默认绑定普通函数直接调用。functionfn(){console.log(this);}fn();浏览器window严格模式undefined② 隐式绑定对象调用。constobj{name:Tom,say(){console.log(this.name);}};obj.say();输出Tom这里this obj因为obj.say()是 obj 调用了 say。隐式绑定丢失很多面试喜欢问。constobj{name:Tom,say(){console.log(this.name);}};constfnobj.say;fn();输出undefined因为fn();已经变成普通函数调用。③ 显式绑定call / apply / bind就是主动指定 this。例如functionfn(age){console.log(this.name,age);}constobj{name:Tom};fn.call(obj,20);输出Tom 20④ new 绑定functionPerson(name){this.namename;}constpnewPerson(Tom);console.log(p.name);new 做了四件事① 创建一个空对象 {} ② this 指向这个对象 ③ 执行函数 ④ 返回对象所以this p⑤ 箭头函数绑定特殊箭头函数没有自己的 this。它会继承外层作用域的 this。例如constobj{name:Tom,say(){constfn(){console.log(this.name);};fn();}};obj.say();输出Tom箭头函数里面没有 this它直接使用say()里的 this。三、call、apply、bind 的区别面试高频假设functionfn(a,b){console.log(this.name,a,b);}constobj{name:Tom};call立即执行。参数一个一个传。fn.call(obj,1,2);等价于this obj fn(1,2)输出Tom 1 2apply立即执行。参数必须放数组。fn.apply(obj,[1,2]);输出Tom 1 2bind不会立即执行。返回一个新函数。constnewFnfn.bind(obj);newFn(1,2);输出Tom 1 2所以方法是否立即执行参数形式返回值call✅一个一个传执行结果apply✅数组执行结果bind❌一个一个传新函数四、为什么箭头函数没有 this这是面试最喜欢问的一题。原因箭头函数的设计目标就是不创建自己的this。普通函数在调用时会创建自己的thisfunctionfn(){}执行时JavaScript 引擎会根据调用方式决定fn() obj.fn() new fn() call() apply()不同调用方式会生成不同的 this。而箭头函数constfn(){};没有自己的this、arguments、super和new.target。它在创建时就会从外层最近的非箭头函数或全局作用域词法捕获Lexical Thisthis之后永远不会改变。例如constobj{name:Tom,say(){constfn(){console.log(this.name);};fn();}};obj.say();执行过程say() 的 this → obj 箭头函数没有自己的 this 直接沿作用域链找到 say() 的 this 所以输出 obj.name五、为什么 call、apply、bind 对箭头函数无效因为箭头函数没有自己的thiscall、apply、bind只能修改普通函数的this无法覆盖箭头函数已经词法绑定的this。constobj1{name:Tom};constobj2{name:Jerry};constfn(){console.log(this.name);};fn.call(obj1);fn.apply(obj2);constnewFnfn.bind(obj1);newFn();三次输出都相同因为箭头函数始终使用创建时所在作用域的this。六、面试回答模板2 分钟JavaScript 中this通常是在函数调用时确定的而不是定义时确定。普通函数主要有默认绑定、隐式绑定、显式绑定call/apply/bind和new绑定四种规则。call和apply都会立即执行函数区别是参数传递方式不同bind不会立即执行而是返回一个绑定了this的新函数。箭头函数比较特殊它没有自己的this采用词法作用域在定义时继承外层作用域的this因此call、apply、bind都无法修改箭头函数的this。这是箭头函数特别适合回调函数和异步场景的重要原因。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/4 15:56:54

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/3 12:09:35

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/4 17:01:23

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/4 12:33:12

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/4 1:25:31

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/4 3:51:11

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉