面试题:说说你对 JS 中 this 指向的了解

面试题:说说你对 JS 中 this 指向的了解

JS 的代码执行环境分为严格模式和非严格模式 ,可以通过 use strict 打开严格模式,此时 JS 在语法检查上会更加严格。要讨论 JS 中的 this 指向问题,也要分为严格模式和非严格模式进行讨论。这里先讨论非严格模式下的 this 指向,然后再讨论严格模式下的不同之处,未谈到的地方默认与严格模式相同。

非严格模式下的 this 指向

  1. 函数独立调用 :此时函数中的 this 指向全局对象(浏览器环境是 window,Node.js 环境是 globalThis)

  2. 函数作为对象的方法调用 :此时函数中的 this 指向该对象。

  3. 函数通过 call、apply 调用 :call 和 apply 方法可以用于直接调用函数,同时指定 this 和传入参数。

    如果 call、apply 传入的表示 this 的参数不是对象(原始值),其会被隐式转换为对应的包装对象。

    js 复制代码
    const obj = new Object();
    fun_name.call(obj, param1, param2,...); // 调用 fun_name 函数,同时指定 this 为 obj,传入多个参数
    fun_name.call(obj, [parm1, param2, ...]); // 调用 fun_name 函数,同时指定 this 为 obj,传入一个数组参数
  4. 调用经 bind 生成的函数 :bind 方法可以生成一个新的函数,同时指定新函数的 this。

    如果 bind 传入的表示 this 的参数不是对象(null 或 undefined),其会被隐式转换为全局对象 window 或 globalThis。

    js 复制代码
    const obj = new Object();
    const new_fun = fun_name.bind(obj); // 生成一个新函数,同时指定新函数中的 this
    new_fun();
  5. 调用 new 构造函数 :此时构造函数中的 this 指向创建的新对象。

  6. 箭头函数调用 :箭头函数没有自己的 this,其使用 this 时会捕获其声明位置的上下文中的 this。

  7. 时间处理函数调用 :此时函数中的 this 通常指向触发事件的 DOM 元素。

注意:这里的函数默认是非箭头函数。

严格模式下的 this 指向

  1. 函数独立调用 : 此时 this 指向 undefined
  2. call、apply、bind 相关的函数调用 :如果 call、apply、bind 传入的表示 this 的参数不是对象(null 或 undefined),其会仍会保持为原始值。(该是啥就是啥)
相关推荐
CRMEB系统商城5 分钟前
前后端技术栈全面换代!CRMEB 多商户(Java)v3.0更新预告
java·开发语言·小程序·php
2601_962885726 分钟前
如何用 Python 画 K 线图(蜡烛图)?(mplfinance + 均线 + 成交量)
开发语言·python
事圆则缓9 分钟前
Flutter 状态管理框架对比(三):Riverpod 如何连起购物车与异步价格
开发语言·javascript·flutter
蓝宝石的傻话11 分钟前
onvif-go(mickeyzzc/onvif-go v2)完整参考手册:从建工程到写出自己的 NVR 接入
开发语言·后端·golang
Elastic 中国社区官方博客20 分钟前
使用 Lucene 搜索你的 Bean —— Elasticsearch
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·lucene
Sayai36 分钟前
Neo4j 内嵌模式(Embedded)实战:Java 嵌入式 vs 服务端部署的写入性能对比与 GC 调优
java·开发语言·性能优化·neo4j·图数据库
lyz24685941 分钟前
vue3页面因参数未声明而报错的常犯错误
前端·javascript·vue.js
Hilaku1 小时前
我重写了整个项目,但没人感谢我!
前端·javascript·程序员
“AI国潮设计-小江”1 小时前
【SDXL实战】用AI生成“财神爷蛋糕×英歌舞人物”潮汕国潮甜品IP,附Prompt与批量生成思路
开发语言·人工智能·python·aigc
繁华的地方不一定留下你的脚印1 小时前
C++线程如何安全停止与唤醒:std::jthread、stop_token与condition_variable
开发语言·c++