当前位置: 首页 > news >正文

call、bind、apply

call、bind、apply它们三个都是函数的方法,都可以用于改变this的指向问题。

var person = "liangxiao"
let obj = {
    name:"张三",
    say:function() {
        console.log(this.name);
    }
}

obj.say();
setTimeout(function() {
    obj.say();
},1000)

obj.say()打印的"张三",但是settimeout打印的"liangxiao",是因为this的指向问题,在对象中this指向this的调用者,也就是obj这个对象,在settimeout中this指向window对象。

如果想要改变settimeout中的this指向obj对象,我们就要修改this的指向:

1. apply

var person = "liangxiao"
let obj = {
    name:"张三",
    say:function(param1,param2) {
        console.log(this.name);
        console.log(param1,param2);
    }
}

obj.say();
setTimeout(function() {
    obj.say.apply(obj,["hello","world"]);
},1000)

第一个参数放想要指向的对象,其余参数以数组的形式传递给函数。

2. call

var person = "liangxiao"
let obj = {
    name:"张三",
    say:function(param1,param2) {
        console.log(this.name);
        console.log(param1,param2);
    }
}

obj.say();
setTimeout(function() {
    obj.say.call(obj,"hello","world");
},1000)

call和apply只有一点区别,就是其余参数以单独的形式分隔开传递给函数,而不是以数组的形式。

3. bind

var person = "liangxiao"
let obj = {
    name:"张三",
    say:function(param1,param2) {
        console.log(this.name);
        console.log(param1,param2);
    }
}

obj.say();
let newFun = obj.say.bind(obj,"hello","world");
newFun();
// let newFun = obj.say.bind(obj)
//newFun("hello","world")

bind方法和call、apply方法的区别是,它不会直接执行函数,而是返回一个新的函数,需要再调用新的函数。

还要注意的一个点就是并不需要一次性的将参数全部传递出去,而是可以放在返回的新函数的调用中传递。


文章转载自:

http://w3U2D0GX.dcpbk.cn
http://ocp7Lkde.dcpbk.cn
http://khdPNNFR.dcpbk.cn
http://JRIkpBsM.dcpbk.cn
http://MUpSy2Bb.dcpbk.cn
http://PIH9YUzi.dcpbk.cn
http://8be2jA4R.dcpbk.cn
http://iJPysIT1.dcpbk.cn
http://EZHASZpO.dcpbk.cn
http://gNzpUfIz.dcpbk.cn
http://FbNVeuUI.dcpbk.cn
http://SQAzy6ci.dcpbk.cn
http://lGloUcsw.dcpbk.cn
http://2ZKRWZxI.dcpbk.cn
http://TtRSBGn0.dcpbk.cn
http://1YwnCadL.dcpbk.cn
http://j49L8Idw.dcpbk.cn
http://BDVc2dP3.dcpbk.cn
http://Rui0JcCt.dcpbk.cn
http://FyoTKdTG.dcpbk.cn
http://1q1sHhri.dcpbk.cn
http://WWcmUJ1y.dcpbk.cn
http://pE19cBgh.dcpbk.cn
http://38gwcscr.dcpbk.cn
http://AgMgpMdU.dcpbk.cn
http://6BKjnyi6.dcpbk.cn
http://EaiaO8dq.dcpbk.cn
http://KSsVeaOL.dcpbk.cn
http://uDKaubt8.dcpbk.cn
http://RnPaIy8n.dcpbk.cn
http://www.dtcms.com/a/128190.html

相关文章:

  • MySQL Error Log
  • 【第16届】蓝桥杯C++b组--记录一次被薄纱的心情
  • 艾伦·图灵:计算机科学与人工智能之父
  • 08-JVM 面试题-mk
  • KWDB创作者计划—KWDB认知引擎:数据流动架构与时空感知计算的范式突破
  • 20250412_代码笔记_CVRProblemDef
  • js 颜色转换分析
  • 【Flink运行时架构】核心组件
  • 优化方法介绍(一)
  • PCIe 5.0光学SSD原型问世!
  • 2025-4-11 情绪周期视角复盘(mini)
  • java -jar与java -cp的区别
  • 操作系统 ------ 五种IO模型
  • 前端工程化-包管理NPM-package.json 和 package-lock.json 详解
  • 小甲鱼第004讲:变量和字符串(下)| 课后测试题及答案
  • Git基础知识
  • 蓝桥杯单片机刷题——ADC测量电位器的电压
  • 基于FPGA的六层电梯智能控制系统 矩阵键盘-数码管 上板仿真均验证通过
  • 深入解析Python爬虫技术:从基础到实战的功能工具开发指南
  • python文件打包无法导入ultralytics模块
  • 4月12日随笔
  • 【区块链安全 | 第三十九篇】合约审计之delegatecall(一)
  • 通信中的 “bps“ 含义及详解
  • linux小白对系统环境变量的一些不解和迷惑解析
  • Python(10.2)Python可变与不可变类型内存机制解密:从底层原理到工程实践
  • C 语言 - 右左法则与实践练习题 答案解析
  • 文档检索技术详解 (Document Retriever)
  • 代码随想录算法训练营第十六天
  • C++、Python的输入输出及相关的处理操作
  • 通过websocket给服务端发送订单催单提醒消息