JS手写call方法

call方法是JS function中内置的一个方法,主要的作用有两个:

  • 改变函数的this指向
  • 向函数中传递参数

使用方式如下:

javascript 复制代码
fn.call(obj, 100, 200)

实现代码示例:

javascript 复制代码
Function.prototype.myCall = function(ctx, ...args) {

  ctx = ctx === undefined || ctx === null ? globalThis : Object(ctx)
  // 定义一个符号,使其唯一
  const key = Symbol()

  // 这样定义,使符号不可枚举
  Object.defineProperty(ctx, key, {
    value: this,
    enumerable: false
  })
  const r = ctx[key](...args)

  // 运行完没用了,就可以删除掉
  delete ctx[key]

  return r
}

function method(a, b) {
  console.log(this, 'this')
  console.log(a, b, 'args')
}

const a = {
  a: 2
}

method.myCall(a, 2, 3)
// 输出结果:{ a: 2 } this
//          2 3 args


method.myCall(this, 2, 3)
// node 环境没有 this
// 输出结果:{} this
//          2 3 args

method.myCall(1, 2, 3)
// 输出结果:[Number: 1] this
//          2 3 args
相关推荐
SystickInt21 分钟前
C语言 strcpy和memcpy 异同/区别
c语言·开发语言
用泥种荷花22 分钟前
Python环境安装
前端
CS Beginner31 分钟前
【C语言】windows下编译mingw版本的glew库
c语言·开发语言·windows
Light6032 分钟前
性能提升 60%:前端性能优化终极指南
前端·性能优化·图片压缩·渲染优化·按需拆包·边缘缓存·ai 自动化
Jimmy36 分钟前
年终总结 - 2025 故事集
前端·后端·程序员
烛阴37 分钟前
C# 正则表达式(2):Regex 基础语法与常用 API 全解析
前端·正则表达式·c#
FJW02081439 分钟前
Python_work4
开发语言·python
roman_日积跬步-终至千里44 分钟前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
GIS之路1 小时前
GIS 数据转换:使用 GDAL 将 TXT 转换为 Shp 数据
前端
多看书少吃饭1 小时前
从Vue到Nuxt.js
前端·javascript·vue.js