前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解析js中的call、apply、bind

解析js中的call、apply、bind

作者头像
csxiaoyao
发布2019-02-15 16:39:33
1.8K0
发布2019-02-15 16:39:33
举报
文章被收录于专栏:csxiaoyaocsxiaoyao

call和apply

1. 改变上下文

代码语言:javascript
复制
obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

callapply作用相同,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj继承了obj的属性和方法,绑定后会立即执行函数。唯一区别是apply接受的是数组参数,call接受的是连续参数。

代码语言:javascript
复制
function add(j, k){
    return j+k;
}
function sub(j, k){
    return j-k;
}
add(5,3); //8
add.call(sub, 5, 3); //8  sub具有了add的属性和方法
add.apply(sub, [5, 3]); //8  sub具有了add的属性和方法
sub(5, 3); //2
sub.call(add, 5, 3); //2  add具有了sub的属性和方法
sub.apply(add, [5, 3]); //2  add具有了sub的属性和方法

2. 调用原生对象的方法

代码语言:javascript
复制
var a = {0:1, 1:"csxiaoyao", length: 2}; 
// a.slice();  // is not a function
console.log(Array.prototype.slice.call(a));//[1, "csxiaoyao"]

对象a类似array,但不具备array的slice等方法。使用call绑定,这时候就可以调用slice方法。

3. 实现继承

通过call和apply,可以实现对象继承

代码语言:javascript
复制
var Parent = function(){
    this.name = "csxiaoyao";
    this.age = 25;
}
var child = {};
console.log(child);//Object {} ,空对象
Parent.call(child);//对象继承,子对象具有了父对象的属性和方法
console.log(child);//Object {name: "csxiaoyao", age: 25}

bind

代码语言:javascript
复制
obj.bind(thisObj, arg1, arg2, ...);

把obj绑定到thisObj,这时候thisObj具备了obj的属性和方法。与call和apply不同的是,bind绑定后不会立即执行。

代码语言:javascript
复制
function add(j, k){
    return j+k;
}
function sub(j, k){
    return j-k;
}
console.log(add.bind(sub, 5, 3)); //function add(j, k){return j+k;}
console.log(add.bind(sub, 5, 3)()); //8

如果bind的第一个参数是null或undefined,等于将this绑定到全局对象。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年05月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • call和apply
    • 1. 改变上下文
      • 2. 调用原生对象的方法
        • 3. 实现继承
        • bind
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档