apply()、call()、bind()

apply()、call()、bind()

每个Function对象都存在apply()call()bind()方法,其作用都是可以在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。

使用#

apply()call()bind()都能改变函数对象的this指向。

Copy
window.name = "A"; // 挂载到window对象的name document.name = "B"; // 挂载到document对象的name var s = { // 自定义一个对象s name: "C" } var rollCall = { name: "Teacher", sayName: function(){ console.log(this.name); } } rollCall.sayName(); // Teacher // apply rollCall.sayName.apply(); // A // 不传参默认绑定window rollCall.sayName.apply(window); // A // 绑定window对象 rollCall.sayName.apply(document); // B // 绑定document对象 rollCall.sayName.apply(s); // C // 绑定自定义对象 // call rollCall.sayName.call(); // A // 不传参默认绑定window rollCall.sayName.call(window); // A // 绑定window对象 rollCall.sayName.call(document); // B // 绑定document对象 rollCall.sayName.call(s); // C // 绑定自定义对象 // bind // 最后一个()是为让其执行 rollCall.sayName.bind()(); //A // 不传参默认绑定window rollCall.sayName.bind(window)(); //A // 绑定window对象 rollCall.sayName.bind(document)(); //B // 绑定document对象 rollCall.sayName.bind(s)(); // C // 绑定自定义对象

区别#

虽然apply()call()bind()都能够达到改变this指针的目的,但是其使用还是有区别的。

Copy
// apply与call传参方式不同 window.name = "Teacher"; var rollCall = { sayAllName: function(...args){ console.log(this.name); args.forEach((v) => console.log(v)); } } // apply 将参数作为一个数组传递 rollCall.sayAllName.apply(window,["A","B","C"]); // Teacher A B C // call 将参数直接传递,使用逗号分隔 rollCall.sayAllName.call(window,"A","B","C"); // Teacher A B C // bind 仅将对象绑定,并不立即执行,其返回值是一个函数,传参方式与 call 相同 var convertThis = rollCall.sayAllName.bind(window,"A","B","C"); convertThis(); // Teacher A B C

每日一题#

Copy
https://github.com/WindrunnerMax/EveryDay
posted @   WindRunnerMax  阅读(149)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
CONTENTS