首页
大数据可视化设计
B端UI设计
系统UI设计
移动端UI设计
图标设计
软件开发
高端网站设计
logo设计
平面设计
关于我们
关于我们
公益活动
设计每日一帖
call、apply、bind 原理实现
2020-4-6
seo达人
目录
call 的模拟实现
apply 的模拟实现
bind 的模拟实现
三者异同
学习并参考于:
JavaScript深入之call和apply的模拟实现
JS的call,apply与bind详解,及其模拟实现
(一)call的模拟实现
call 用法 : MDN Function.prototype.call()
call() 方法使用一个指定的 this 值和可选的参数列表来调用一个函数。
call() 提供新的 this 值给当前调用的函数/方法。
call 实现主要思路:
将函数设为对象的属性
执行该函数
删除该函数
另外还有考虑:
call 函数还能给定参数执行函数
this 参数不传,或者传null,undefined, this指向window对象
函数是可以有返回值的
实现:
Function.prototype.myCall = function () {
if (typeof this !== 'function') {
throw new TypeError('error!')
}
let context = arguments[0] || window //this 参数可以传 null,当为 null 的时候,视为指向 window
context.fn = this // 首先要获取调用call的函数,用this可以获取
let args = [...arguments].slice(1) //从 Arguments 对象中取值,取出第二个到最后一个参数
let result = context.fn(...args) //函数是可以有返回值的
delete context.fn
return result
}
测试:
// 测试一下上面实现的myCall
var value = 2;
var obj = {
value: 1
}
function bar(name, age) {
console.log(this.value);
return {
value: this.value,
name: name,
age: age
}
}
bar.call(null); // 2
console.log(bar.myCall(obj, 'kevin', 18));
// 1
// Object {
// value: 1,
// name: 'kevin',
// age: 18
// }
(二)apply 的模拟实现
apply 用法:MDN Function.prototype.apply()
apply() 方法使用一个指定的 this 值和可选的参数数组 来调用一个函数。
apply 的实现跟 call 类似。
实现:
Function.prototype.myApply = function () {
if (typeof this !== 'function') {
throw new TypeError('error!')
}
let context = arguments[0] || window
context.fn = this
let result = arguments[1] ? context.fn(...arguments[1]) : context.fn()
delete context.fn
return result
}
测试:
var foo = {
value: 1
}
function bar(name, age) {
console.log(name)
console.log(age)
console.log(this.value);
}
bar.myApply(foo, ['black', '18']) // black 18 1
(三)bind 的模拟实现
bind 用法:MDN Function.prototype.bind()
bind()方法会创建一个新函数,称为绑定函数。当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,之后的一序列参数将会在传递的实参前传入作为它的参数。
bind是ES5新增的一个方法,不会执行对应的函数,而是返回对绑定函数的引用。
实现:
Function.prototype.customBind = function () {
if (typeof this !== 'function') {
throw new TypeError('error!')
}
const that = this // 首先要获取调用bind的函数,用this获取并存放在that中
let context = arguments[0] || window
const args = [...arguments].slice(1)
return function() {
return that.apply(context, args.concat([...arguments]))
}
}
(四)三者异同
相同:
改变函数体内 this 的指向
不同:
call、apply的区别:call方法接受的是参数列表,而apply方法接受的是一个参数数组。
bind不立即执行。而call或apply会自动执行对应的函数。
分享本文至:
«
TinyUI-TUIListView最简单的使用
JavaScript 的简述与基础语法
»
分类
大数据可视化设计文章及欣赏(131)
B端ui设计文章及欣赏(589)
系统UI设计文章及欣赏(82)
移动端UI设计文章及欣赏(681)
图标设计文章及欣赏(118)
网站设计文章及欣赏(480)
平面设计(251)
行业趋势(459)
设计资源(872)
交互设计及用户体验(896)
前端及开发文章及欣赏(1031)
随笔的一些文章(63)
设计思维(1867)
用户研究(241)
设计管理与成长(338)
seo优化(498)
日历
链接
个人资料
蓝蓝设计的小编
http://www.lanlanwork.com
存档
2024年11月(61)
2024年10月(168)
2024年9月(145)
2024年8月(165)
2024年7月(108)
2024年6月(65)
2024年5月(73)
2024年4月(44)
2024年3月(50)
2024年2月(58)
2024年1月(44)
2023年12月(47)
2023年11月(41)
2023年10月(14)
2023年9月(27)
2023年8月(88)
2023年7月(62)
2023年6月(58)
2023年5月(28)
2023年4月(47)
2023年3月(37)
2023年2月(90)
2023年1月(78)
2022年12月(45)
2022年11月(69)
2022年10月(51)
2022年9月(135)
2022年8月(60)
2022年7月(111)
2022年6月(162)
2022年5月(143)
2022年4月(86)
2022年3月(119)
2022年2月(53)
2022年1月(99)
2021年12月(105)
2021年11月(83)
2021年10月(101)
2021年9月(153)
2021年8月(147)
2021年7月(149)
2021年6月(157)
2021年5月(124)
2021年4月(185)
2021年3月(144)
2021年2月(35)
2021年1月(103)
2020年12月(95)
2020年11月(76)
2020年10月(31)
2020年9月(45)
2020年8月(50)
2020年7月(46)
2020年6月(33)
2020年5月(78)
2020年4月(69)
2020年3月(100)
2020年2月(59)
2020年1月(31)
2019年12月(50)
2019年11月(57)
2019年10月(48)
2019年9月(48)
2019年8月(57)
2019年7月(58)
2019年6月(58)
2019年5月(31)
2019年4月(37)
2019年3月(43)
2019年2月(25)
2019年1月(45)
2018年12月(41)
2018年11月(40)
2018年10月(29)
2018年9月(40)
2018年8月(87)
2018年7月(107)
2018年6月(86)
2018年5月(109)
2018年4月(40)
2018年3月(35)
2017年8月(35)
2017年7月(45)
2017年6月(7)
2017年5月(27)
2017年4月(51)
2017年3月(69)
2017年2月(65)
2017年1月(69)
2016年12月(55)
2016年11月(111)
2016年10月(92)
2016年9月(53)
2016年8月(9)
2016年7月(4)
2016年6月(9)
2016年3月(19)
2016年2月(26)
2016年1月(29)
2015年12月(34)
2015年11月(35)
2015年10月(46)
2015年9月(43)
2015年8月(40)
2015年7月(33)
2015年6月(46)
2015年5月(58)
2015年4月(70)
2015年3月(55)
2015年2月(17)
2015年1月(33)
2014年12月(21)
2014年11月(83)
2014年10月(94)
2014年9月(6)
2014年8月(1)
2014年7月(13)
2014年6月(66)
2014年5月(99)
2014年4月(88)
2014年3月(101)
2014年2月(67)
2014年1月(83)
2013年12月(106)
2013年11月(111)
2013年10月(61)
2013年9月(20)
2013年7月(13)
2013年6月(27)
2013年5月(48)
2013年4月(39)
2013年3月(8)
2013年2月(20)
2013年1月(31)
2012年12月(33)
2012年11月(31)
2012年10月(22)
2012年9月(8)
2012年7月(14)
2012年6月(15)
2012年5月(31)
2012年4月(24)
2012年2月(4)
2012年1月(8)
2011年12月(35)
2011年11月(32)
2011年10月(13)
2011年8月(1)
2011年6月(1)