JS中bind、call、apply三个方法的使用不同在哪
导读:这篇文章主要给大家介绍“JS中bind、call、apply三个方法的使用不同在哪”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“JS中bind、call、apply三个方...
这篇文章主要给大家介绍“JS中bind、call、apply三个方法的使用不同在哪”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“JS中bind、call、apply三个方法的使用不同在哪”文章能对大家有所帮助。call的基本使用
var ary = [12, 23, 34];
ary.slice();
以上两行简单的代码的执行过程为:ary这个实例通过原型链的查找机制找到array.prototype上的slice方法,让找到的slice方法执行,在执行slice方法的过程中才把ary数组进行了截取。
注意:slice方法执行之前有一个在原型上查找的过程(当前实例中没有找到,再根据原型链查找)。
当知道了一个对象调用方法会有一个查找过程之后,我们再看:
var obj = {
name:'iceman'}
;
function fn() {
console.log(this);
console.log(this.name);
}
fn();
// this -->
window
// obj.fn();
// uncaught typeerror: obj.fn is not a function
fn.call(obj);
call方法的作用:首先寻找call方法,最后通过原型链在function的原型中找到call方法,然后让call方法执行,在执行call方法的时候,让fn方法中的this变为第一个参数值obj,最后再把fn这个函数执行。
知道这个原型上的原理后,咱们就可以动手分析实现这三个方法了。
bind、call、apply 区别
call和apply都是为了解决改变this的指向。作用都是相同的,只是传参的方式不同。- 除了第一个参数外,
call可以接收一个参数列表,apply只接受一个参数数组
let a = {
value: 1
}
function getvalue(name, age) {
console.log(name)
console.log(age)
console.log(this.value)
}
getvalue.call(a, 'yck', '24')
getvalue.apply(a, ['yck', '24'])
bind和其他两个方法作用也是一致的,只是该方法会返回一个函数。并且我们可以通过bind实现柯里化
如何实现一个 bind 函数
对于实现以下几个函数,可以从几个方面思考
- 不传入第一个参数,那么默认为
window - 改变了
this指向,让新的对象可以执行该函数。那么思路是否可以变成给新的对象添加一个函数,然后在执行完以后删除?
当然是肯定的,于是我们可以这样写:
function.prototype.mybind = function (context) {
if (typeof this !== 'function') {
throw new typeerror('error')
}
var _this = this
var args = [...arguments].slice(1)
// 返回一个函数
return function f() {
// 因为返回了一个函数,我们可以 new f(),所以需要判断
if (this instanceof f) {
return new _this(...args, ...arguments)
}
return _this.apply(context, args.concat(...arguments))
}
}
如何实现一个 call 函数
function.prototype.mycall = function (context,...arg) {
var context = context || window // 给 context 添加一个属性
// getvalue.call(a, 'yck', '24') =>
a.fn = getvalue
//使用symbol 选择一个独一无二的值作为新添加的属性
let symbol = new symbol();
context[symbol] = this;
let result = context[symbol](...arg)
// 删除添加的函数
delete context[symbol]
return result
}
如何实现一个apply 函数
apply实现原理与call实现基本类似,只有传值的方式不一样。
function.prototype.myapply = function (context,arg) {
var context = context || window // 给 context 添加一个属性
// getvalue.call(a, 'yck', '24') =>
a.fn = getvalue
//使用symbol 选择一个独一无二的值作为新添加的属性
let symbol = new symbol();
context[symbol] = this;
let result = context[symbol](arg)
// 删除添加的函数
delete context[symbol]
return result
}
经过对以上的函数进行检测 , 完美通过。
const obj = {
name : 'xiaoxiao',
getname : function (arg) {
console.log(`我是${
this.name}
里面的,我里面有${
arg}
`);
}
}
obj.getname([0,0,0,0,0]);
// 我是xiaoxiao里面的
const obj2 = {
name : 'huahua'
}
//传值不一样
obj.getname.mycall(obj2,1,1,1,1,1,1);
obj.getname.mybind(obj2)(2,2,2,2,2,2);
obj.getname.myapply(obj2,[3,3,3,3,3,3]);
更多关于js中call、apply三个方法的区别与使用方式请查看下面的相关链接
通过以上内容的阐述,相信大家对“JS中bind、call、apply三个方法的使用不同在哪”已经有了进一步的了解,更多相关的问题,欢迎关注网络或到官网咨询客服。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: JS中bind、call、apply三个方法的使用不同在哪
本文地址: https://pptw.com/jishu/654444.html
