call/apply/bind作用和区别

深入解析EtherCAT通讯DS402协议下的伺服电机控制模式选择与配置 本文深入解析了EtherCAT通讯DS402协议下的伺服电机控制模式选择与配置,详细介绍了六种核心控制模式(如PPM、CSP、CSV、CST)的应用场景及实战技巧。通过EtherCAT和DS402协议的高效配合,实现工业自动化中伺服电机的精准控制,提升设备性能与稳定性。 阅读详情

答案:

他们都可以改变函数的作用域。

  • call/apply 可以直接执行该函数,而 bind 不会立刻执行

fucntion.bind(thisArg, arg1, arg2, ...)
  • call/apply 作用类似,都可以改变指针和执行函数,区别在于传参不同,call 需要单个传参,apply 通过数组传参

function.call(thisArg, arg1, arg2, ...)
function.apply(thisArg, [arg1, arg2, ...])

 

详细解析:

this代表函数(方法)执行的上下文环境,但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。

  • 1.在方法中,this 表示该方法所属的对象。
  • 2.如果单独使用,this 表示全局对象。
  • 3.在函数中,this 表示全局对象。
  • 4.在函数中,在严格模式下,this 是未定义的(undefined)。
  • 5.在事件中,this 表示接收事件的元素。
  • 6.类似 call() 和 apply() 方法可以将 this 引用到任何对象。

JavaScript 提供了call、apply、bind这三个方法,来切换/固定this的指向。

call和apply

call 和 aplly 作用完全一样,都是在特定的上下文中调用函数,或者说改变函数内部的this指向;区别仅在于接收参数的方式不同。

function add(a, b) {
  return a + b;
}
 
function sub(a, b) {
  return a - b;
}
 
console.log(add.call(sub, 2, 1));//3

为什么add.call(sub, 2, 1)的执行结果是3呢,因为call()方法改变了this的指向,使得sub可以调用add的方法,也就是用sub去执行add中的内容。

var dog = {
  name: "dog"
};
var cat = {
  name: "cat"
};
var sayName = function (age, gender) {
  console.log(this.name + "," + age + "," + gender)
};
sayName(); //undefined
sayName.call(dog, 2, "male"); //dog,2,male
sayName.call(cat, 3, "female"); //cat,3,female
sayName.apply(dog, [2, "male"]); //dog,2,male
sayName.apply(cat, [3, "female"]); //cat,3,female

我们在全局环境定义了一个 sayName 方法,调用该方法时会将当前环境的 name 属性 (this.name) 显示到控制台上。当我们在全局环境调用 sayName() 时,由于全局环境并没有 this.name 属性,因此显示了 undefined。

使用 call 或者 apply,就可以改变函数的执行环境,或者说改变函数内部的 this 指向。例如 sayName.call(dog),表示将sayName 内部的 this 指向了 dog 对象,因此 this.name 显示为 "dog"。当我们调用sayName.call(cat)时,sayName 内部的 this 又指向了 cat 对象。总结一句话就是call()可以让括号里的对象来继承括号外函数的属性。

可以看出来,call与apply的作用完全相同,区别仅在于接收参数的方式不同。

fn.call(context, arg1, arg2, ...)
fn.apply(context, [arg1, arg2, ...])

call 和 apply 接收的第一个参数都是函数的运行环境。使用 call 时传递给函数的参数必须逐个传入,而使用 apply 时函数的参数应该是一个数组,或者类数组对象(如 arguments 对象)。至于使用 call 还是 apply,完全取决于采用哪种方法给函数传递参数更方便。在不需要给函数传递参数的情况下,使用哪个方法都无所谓。

apply的2种写法:

People.apply(this, [name, age]);
People.apply(this, arguments);

在这里arguments和[name, age]是等价的。

 

bind

bind 与前两者作用类似,都是改变函数内部的 this 指向,区别在于 bind 会创建一个新的函数实例,每次调用该实例时,都会在被绑定的环境中运行。简单来说就是,bind方法返回一个新函数,以后调用了才会执行,但apply、call会立即执行。

function f(y, z){
  return this.x + y + z;
}
var m = f.bind({x : 1}, 2);
console.log(m(3));
//6

这里bind方法会把它的第一个实参绑定给f函数体内的this,所以这里的this即指向{x : 1}对象,从第二个参数起,会依次传递给原始函数,这里的第二个参数2,即是f函数的y参数,最后调用m(3)的时候,这里的3便是最后一个参数z了,所以执行结果为1 + 2 + 3 = 6分步处理参数的过程其实是一个典型的函数柯里化的过程(Curry)。

var dog = {
  name: "dog"
};
var cat = {
  name: "cat"
};
var sayName = (function (age, gender) {
  console.log(this.name + "," + age + "," + gender)
}).bind(dog, 3, "male");
sayName.call(cat, 2, "female"); //dog,3,male

我们创建 sayName 函数时,使用 bind 将该函数的 this 指向了 dog 对象,同时还绑定了传入函数的参数。

现在我们调用 sayName.call(cat, 2, "female"),发现不论是this对象,还是传入函数的参数,都是之前被绑定的值了。

华为昇腾服务器npu中安装paddle,pytorch等环境,训练代码迁移适配等问题记录 参考文档:https://github.com/PaddlePaddle/PaddleCustomDevice/blob/develop/backends/npu/README_cn.md 阅读详情

相关推荐

UR机械臂正逆运动学解析:从DH参数到8组解的完整求解策略

本文深入解析UR机械臂的正逆运动学求解策略,从DH参数原理到完整的8组解求解方法。详细介绍了正运动学的坐标变换过程,以及逆运动学中Atan2函数和三角恒等变换的应用,并揭示了8组解的产生机制。通过实际案例和调试技巧,帮助工程师掌握UR机械臂运动学求解的核心技术。

weixin_29094775的博客 412

call 、apply 、bind的区别和作用

bind、apply、call 之间的区别是:1、执行方式不同;3、修改this的性质不同。执行方式不同是指,call和apply是改变后页面加载之后就立即执行,是同步代码。bind是异步代码,改变后不会立即执行;而是返回一个新的函数。1、都是用来改变this指向的,都是跟在函数的后面;

wcxrib的博客 2206

ESP32-C5 Wi-Fi CSI感知技术原理与工程实践

Wi-Fi信道状态信息(CSI)是OFDM系统中反映多径信道特性的复数频域响应,源于导频子载波的信道估计过程,本质属于物理层原始观测数据。其高维度(如56子载波)、高时间分辨率(百赫兹级采样)及零硬件增益的特性,使其成为无感人体感知的理想信号源。相比UWB或毫米波雷达,CSI方案依托现有Wi-Fi基础设施,兼具成本优势与部署灵活性,广泛应用于呼吸监测、跌倒检测、手势识别等边缘智能场景。乐鑫ESP32-C5通过5.8GHz低噪接收、亚纳秒级多天线同步与固件级CSI增强,显著提升微动感知鲁棒性,结合AGC锁定、

weixin_42153793的博客 343

call、apply、bind 作用和区别

call、apply、bind 作用和区别、使用场景

大圣归来圣骑士清欢的博客 2278

【VS2017】“LNK1104 cannot open file ‘python39_d.lib‘ “

记录一下编译调用了python代码的C语言源程序时遇到的问题 版本:以python3.9.1为例 先确保你安装了python的debug版本,如果没有,用对应版本安装包可以修改已经安装的python,如图。 选择 “Modify” 选择next 确保最后一项勾选,然后install。 光安装了还不够,需要配置一下C语言编译器。 以VS2017为例: 将python37_d.lib(在安装目录下的libs文件夹里有python39_d.lib)所在文件夹的路径添加到库目录里面,右键你的解决方案,选.

m0_46296905的博客 6474

线上专利申请(超详细)| 签名确认

在【法人登录】页面点击【证书登录】按钮,弹出证书登录提示框,点击【确 认】按钮,进入到输入证书密码页面,点击【取消】按钮,取消本次操作。企业在提交申请时,需要增加签名,如使用企业账户点击提交,会弹出“法人、代理机构不能签名,请使用经办人签名”,这个时候就需要换个账号了。在需要签名时,将专利官网的登录方式点击法人登录,选择扫码登录,使用移动端经办人账户的扫一扫功能扫描登录。登录完成后,再点击签名,使用移动端扫一扫功能,扫描签名,输入证书号,确认签名,并提交。最后,祝大家的申请都成功!

weixin_62112323的博客 9109

call ,apply和bind方法 详解

JavaScript 函数call、apply和bind的区别和用法详解

3万+

基于EB工具的TC3xx_MCAL配置开发05_ADC模块硬件Pwm触发Demo配置

基于EB工具,硬件Pwm触发ADC采集Demo配置详细介绍

initiallizer的博客 3505

「干货」细说 call、apply 以及 bind 的区别和用法

前言 上一篇文章 《「前端面试题系列4」this 的原理以及用法》 中,提到了 call 和 apply。 它们最主要的作用,是改变 this 的指向。在平时的工作中,除了在写一些基础类,或者公用库方法的时候会用到它们,其他时候 call 和 apply 的应用场景并不多。 不过,突然遇到的时候,需要想一下才能转过弯来。所以今天,就让我们好好地探究一下,这两个方法的区别以及一些妙用。最后,还会介绍...

weixin_34240520的博客 537

基于深度学习的水质预测:多参数监测与预测

首先,我们需要收集水质监测的多参数数据。收集到的数据应包括不同时间点的水质参数值以及相应的水质等级标签,用于训练和评估深度学习模型。同时,数据的质量和数量对于模型的性能也有重要影响,因此在实际应用中需要充分考虑数据的采集和处理过程。总之,基于深度学习的水质预测可以通过收集水质监测的多参数数据并使用适当的深度学习模型进行训练和预测来实现。通过以上的深度学习模型,我们可以利用水质监测的多参数数据进行水质预测。这种基于深度学习的方法可以提高水质预测的准确性和稳定性,为水质监测和环境保护提供有力支持。

web_bug407的博客 1102

C# MVVM的“核武器”:CommunityToolkit.Mvvm的RelayCommand实战全解

你默默打开VS:“该用RelayCommand的‘量子纠缠’魔法了!用户点击按钮无响应,调试器显示命令未绑定,但代码看起来完美无缺。“我的MVVM应用?那可是能穿越线程的命令量子计算机!异步操作阻塞了UI线程,用户界面变成“加载中”死循环。:UI与业务逻辑通过命令“量子隧道”解耦。:所有长时间操作自动进入“量子跃迁”模式。:携带任意上下文的“量子信封”传递。:命令可用性随数据变化实时同步。

java专栏 663

call、apply与bind 用法和区别

call、apply与bind有什么区别

weixin_54955442的博客 3793

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

前端.call/apply/bind的作用和区别

在了解一个东西前,先需要了解这个东西为什么需要被创造出来 举个例子,ex: <script> var a = { name : "fang" , setName : (name) => { console.log(name) } } var b = { name : "...

生活百般滋味,人生需要笑对 3519

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

bind、call、apply 区别

一、bind、call、apply的作用 关于call、apply、bind函数,它们主要用来改变this指向的,在很多框架中常有用到,而且也是面试官喜欢问到的问题:多数会问道三者的区别, 以及手动实现它们。 call的用法 fn.call(thisArg, arg1, arg2, arg3, ...) 调用fn.call时会将fn中的this指向修改为传入的第一个参数thisArg;将后面的参数传入给fn,并立即执行函数fn。 let obj = { name: "xiaoming",

weixin_40856652的博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

call、apply和bind的区别

面试会经常被问到哦!!!!!

hmxs_hmbb的博客 1万+

call、bind、apply三者的区别

当一个函数作为构造器使用时(通过 new 关键字), 它的 this 值绑定到新创建的那个对象。3、如果你在声明一个变量的时候没有使用var或者let、const(es6),你就是在给全局的this添加或者改变属性值。this改变为obj了,但是绑定的时候立即执行,当触发点击事件的时候执行的是fn的返回值undefined。对于函数中的this的指向问题,有一句话很好用:运行时this永远指向最后调用它的那个对象。bind会把fn中的this预处理为obj,此时fn没有执行,当点击的时候才会把fn执行。

nanxun201314的博客 9156

Call Apply Bind有什么区别

在JavaScript中,、和是Function对象上的三个方法,它们都允许开发者指定函数内部的值。然而,它们在使用方式和功能上有着细微但重要的区别。理解这些差异对于编写高效、可维护的前端代码至关重要。 方法允许调用一个函数,并且显式地指定的值,同时可以传递参数列表给该函数。与类似,也用于调用函数并指定的值,但是它接受参数数组或类数组对象作为参数传递给函数。方法不会立即执行函数,而是返回一个新的函数,这个新函数的值被永久绑定到了时传入的第一个参数上。 说明: 不同角度思考:有时候我们需要处理不定数量的参数,

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1303

call,apply和bind的用法及区别

git使用说明 如何生成SSH公钥 1. 安装git 双击 Git-2.21.0-64-bit.exe 一路回车即可安装 2. 公钥生成 桌面右键打开Git Bash Here, 使用如下命令生成公钥, 一路回车即可. ssh-keygen 显示如下 Generating public/private rsa key pair. Enter file in which to save the k...

denghuocc 2861

bind、call、apply区别

在JavaScript中,call、apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向。 call、apply、bind方法的共同点和区别:apply、call、bind三者都是用来改变函数的this对象的指向的;apply、call、bind三者第一个参数都是this要指向的对象,也就是想指定的上下文(函数的每次调用都会拥有一个特殊值——本次调用的上下文(context)——这就是this关键字的值。);apply、call、b...

qq_46131492的博客 3244

call、bind、apply的区别

apply call bind

yujiabao702的博客 855

call apply bind的作用和区别

1.call apply bind 的作用和区别 作用: 都可以改变函数内部的this指向。 区别点: 1.call和apply会调用函数,并且改变函数内部this指向。 2.call和apply传递的参数不一样,call传递参数arg1,arg2..形式apply必须数组形式[arg] 3.bind不回调用函数,可以改变函数内部this指向。 解析: call方法 改变函数内部this指向 call()方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的this指向。 写

XIAXING123的博客 2521

javascript 中 bind、call和apply的区别

本文详细讲解了javascript 中 bind call apply 的区别以及使用场景和使用方法

Sherry Tian的博客 924

call,apply,bind三者的区别

1、本质上的区别三者最大的区别是call和apply会改变this的指向并且立即执行函数,但是bind方法不会立即执行函数,而是会返回this改变后的函数。 let obj = { name:'张三', age:18, func:function(){ console.log(this.name + "年龄" + this.age); } }

qq_55928824的博客 5279

call、apply、bind的应用和区别

call、apply、bind的应用和区别 首先,要明白这三个函数的存在意义是什么?答案是改变函数执行时的上下文,再具体一点就是改变函数运行时的this指向。有了这个认识,接下来我们使用实例来看一下,怎么使用这三个函数。 let obj1 = {name: 'tom'}; let obj2 = {name: 'jack'}; function Child(name){ this.name = name; } Child.prototype = { constr

suwu150 3189

apply、call、bind区别、用法

apply和call都是为了改变某个函数运行时的上下文而存在的(就是为了改变函数内部this的指向); 如果使用apply或call方法,那么this指向他们的第一个参数,apply的第二个参数是一个参数数组,call的第二个及其以后的参数都是数组里面的元素,就是说要全部列举出来; 他们的常用用法: 1.数组之间的追加; 2.获取数组中的最大值和最小值,利用他们扩充作用域拥

A_dangdang的博客 1万+

call , apply, bind, 的区别

apply和call都是为了改变某个函数运行时的上下文而存在的 (就是为了改变函数内部this的指向); 如果使用apply或call方法,那么this指向他们的第一个参数,apply的第二个参数是一个参数数组,call的第二个及其以后的参数都是数组里面的元素,就是说要全部列举出来; bind() 也是改变函数体内this的指向; bind会创建一个新函数,称为绑定函数,当调用这个函数的时候,绑定函数会以创建它时传入bind()方法的第一个参数作为this,传入bind()方法的第二个及以后的参数加上绑

weixin_48895522的博客 3787
上一篇: DOM节点创建和修改有哪些常用API
下一篇: 观察者和发布订阅者区别
SpringRolls
博客等级 码龄9年 73粉丝 129原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值