JS之call、apply、bind的区别与实现
call、apply、bind的区别
- call、apply、bind相同点:都是改变this的指向,传入的第一个参数都是绑定this的指向,在非严格模式中,如果第一个参数是nul或者undefined,会把全局对象(浏览器是window)作为this的值,要注意的是,在严格模式中,null 就是 null,undefined 就是 undefined
- call和apply唯一的区别是:call传入的是参数列表,apply传入的是数组,也可以是类数组
- bind和call、apply的区别: bind返回的是一个改变了this指向的函数,便于稍后调用,不像call和apply会立即调用;bind和call很像,传入的也是参数列表,但是可以多次传入,不需要像call,一次传入
- 值得注意:当 bind 返回的函数 使用new作为构造函数时,绑定的 this 值会失效,this指向实例对象,但传入的参数依然生效 (new调用的优先级 > bind调用)
call实现
对象context想调用一个它没有的方法f 怎么办呢?f.call(context)
通过call来借用方法f ,怎么做到的呢?
1.对象context添加f方法
2.对象context执行f方法
Function.prototype.myCall = function(context, ...arg) {// 如果第一个参数传入的是undefined和null,context为window对象context = context || window;// 为context对象添加函数barcontext.fn = this; // this:bar,this指向调用myCall的bar // context对象执行函数bar,并返回结果returncontext.fn(...arg);
}
// 测试一下
var value = 2;
var obj = {value: 1
}
function bar(name, age) {console.log(this.value);return {value: this.value,name: name,age: age}
}
bar.myCall(null); // 2
console.log(bar.myCall(obj, 'kevin', 18)); //1
// Object {
//value: 1,
//name: 'kevin',
//age: 18
// }
apply实现
apply和call唯一的区别是:call传入的是参数列表,apply传入的是数组,也可以是类数组
Function.prototype.myApply = function(context, arg) {// 如果第一个参数传入的是undefined和null,contex
chenhui32: 这是妥妥的偷别人文章,字都不改的
敲键盘的小夜猫: 这篇博客真是写得太棒了!让读者能够从中获取丰富的知识和灵感。 【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
高山我梦口香糖: 那前端应用是不是得和代理服务器运行在同一个端口下?