原文地址:https://blog.csdn.net/whuzxq/article/details/64166253

由于在理解this的用法的时候多次出现了这几个方法,个人对这几个方法理解的不是很透彻,因此拿出来整理一下。关于this的用法,可移步至如下网址查看:

【Web】Javascript中的this陷阱(一)

http://blog.csdn.net/whuzxq/article/details/63265901

【Web】Javascript中的this陷阱(二)

http://blog.csdn.net/WHUZXQ/article/details/64142443


1.call()

语法:它的第一个参数用作 this 的对象。其他参数都直接传递给函数自身。

call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 

实例:
function sayColor(sPrefix,sSuffix) {
    alert(sPrefix + this.color + sSuffix);
};

var obj = new Object();
obj.color = "blue";

sayColor.call(obj, "The color is ", "a very nice color indeed.");
//The color is blue, a very nice color indeed.

在这个例子中,函数 sayColor() 在对象外定义,即使它不属于任何对象,也可以引用关键字 this。对象 obj 的 color 属性等于 blue。调用 call() 方法时,第一个参数是 obj,说明应该赋予 sayColor() 函数中的 this 关键字值是 obj。第二个和第三个参数是字符串。它们与 sayColor() 函数中的参数 sPrefix 和 sSuffix 匹配,最后生成的消息 “The color is blue, a very nice color indeed.” 将被显示出来。

要与继承机制的对象冒充方法一起使用该方法,只需将前三行的赋值、调用和删除代码替换即可:
function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.call(this, sColor);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

其他: 
call 方法也可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
function Animal(name){
    this.name = name;
    this.showName = function(){
        alert(this.name);
    }
}      

function Cat(name){
    Animal.call(this, name);
}      

var cat = new Cat("Black Cat");
cat.showName();  

call 的意思是把 animal 的方法放到cat上执行,原来cat是没有showName() 方法,现在是把animal 的showName()方法放到 cat上来执行,所以this.name 应该是 Cat。

2.apply()

语法:apply() 方法有两个参数,用作 this 的对象和要传递给函数的参数的数组。
apply([thisObj[,argArray]]) 
  • 1

先看一个实例:

function sayColor(sPrefix,sSuffix) {
    alert(sPrefix + this.color + sSuffix);
};

var obj = new Object();
obj.color = "blue";

sayColor.apply(obj, new Array("The color is ", "a very nice color indeed."));

调用 apply() 方法时,第一个参数仍是 obj,说明应该赋予 sayColor() 函数中的 this 关键字值是 obj。第二个参数是由两个字符串构成的数组,与 sayColor() 函数中的参数 sPrefix 和 sSuffix 匹配,最后生成的消息仍是 “The color is blue, a very nice color indeed.”,将被显示出来。

小结:apply()和call()均是从ECMAScript 继承机制实现引申而来,因此理解好继承至关重要。

3.bind()

1..bind方法中的this
function f(){
return this.a;
}

var g=f.bind({a:test});//参数是一个对象,作为this
console.log(g());//test

var o={a:37,f:f,g:g};
console.log(o.f(),o.g());//37,test
//o.f():以对象属性调用,this指向o;o.g():虽然以对象的属性调用,但是仍然按照之前的绑定

2.bind方法
this.x=9;
var module={
x:81,
getX:function(){return this.x;}
};

module.getX();//81
var getX=module.getX;//赋值给变量,直接调用,this会指向全局对象,则返回9
getX();//9

var boundGetX=getX.bind(module);//绑定module对象
boundGetX();//81

3.bind的科里化
function add(a,b,c){

return a+b+c;
}

var func=add.bind(undefind,100);//无需指定传入的对象,但是指定了一个参数为100,那么a将赋值100
func(1,2)//103

var func2=func.bind(undefined,200);//因为a已经被指定,因此将b指定为200
func2(10);310

4.bind与new
function foo(){
this.b=100;//直接调用的话,则创建全局对象b
return this.a;
}

var func=foo.bind({a:1});
func();//1
new func();//{b:100}  使用new的话,将会把this作为返回值,并且this会被初始化为一个默认的空对象,该空对象的原型指向foo.prototype.即使用了bind,也无法指向指定对象。return this.a将会被忽略。5.bind方法模拟 
bind作用:绑定this+科里化
Function.prototype.bind=function(oThis){
if(typeof this !=='function'){//同过对象.方法调用的方式,那么this将指向一个函数
 throw new TypeError("error");
}

var aArgs=Array.prototype.slice.call(arguments,1),//通过argument获取其他的参数,由于arguments不是数组,因此通过以上方式使用slice方法,忽略掉第一个参数,从第二个参数往后获取。
fToBind=this,
fNOP=function(){},
fBound=function(){
return fToBind.apply(this.instanceof fNOP? this:oThis,aArgs.concat(Arrat.prototype.slice.call(arguments)));

fNOP.prototype=this.prototype;
fBound.prototype=new fNOP();

return fBound;

}

}

用法:小白一枚,这篇教程就点到为止,更加详细的使用方法详见[http://blog.liuwanlin.info/javascriptzhong-bindfang-fa-de-shi-xian/]

先MARK,明天继续看。

【Web】浅析JQuery的apply(), call(), bind()方法的更多相关文章

  1. JS中的call、apply、bind方法

    JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]] ...

  2. Javascript中call,apply,bind方法的详解与总结

    在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,thi ...

  3. 深入理解jQuery中live与bind方法的区别

    本篇文章主要是对jQuery中live与bind方法的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 注意如果是通过jq添加的层和对象一定要用live(),用其他的都不起作用 ...

  4. 理解JS中的call、apply、bind方法(*****************************************************************)

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

  5. 重写apply, call, bind方法

    重写apply, call, bind方法 //原生JavaScript封装apply方法,第四版 Function.prototype.applyFour = function(context) { ...

  6. 简单模拟实现javascript中的call、apply、bind方法

    目录 引子 隐式丢失 硬绑定 实现及原理分析 总体实现(纯净版/没有注释) 写在最后 引子 读完<你不知道的JavaScript--上卷>中关于this的介绍和深入的章节后,对于this的 ...

  7. JS中的call、apply、bind方法详解

    bind 是返回对应函数,便于稍后调用:apply .call 则是立即调用 . apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(co ...

  8. javascript中函数的call,apply及bind方法

    call 方法调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,  [,.argN]]]]])参数thisObj可选项.将被用作当前对象的对象. ...

  9. js中的call()、apply()和bind()方法的区别

    call(thisObj,param1,param2....)方法:调用一个对象的方法,用另外的对象去替换当前对象. 下面给出一个例子: function add(a,b){ return a+b; ...

随机推荐

  1. Kubernetes重大漏洞?阿里云已第一时间全面修复

    近日,Kubernetes社区发现安全漏洞 CVE-2018-1002105,阿里云容器服务已在第一时间完成全面修复,敬请广大用户登录阿里云控制台升级Kubernetes版本. 目前Kubernete ...

  2. JCF——set

    HashSet LinkedHashSet TreeSet 联系与区别

  3. 中位数+暴力——cf433C

    /* 中位数到所有数的距离之和最小 因为只能改一个数,所以我们找一个数,将其改为和其相邻的数的中位数,使答案最小 先求一次原答案 把每个数相邻的数用vector存下来,然后排序找中位数,计算减小的量 ...

  4. 【转】java使用java.lang.management监视和管理 Java 虚拟机

    原文地址:https://blog.csdn.net/zhongweijian/article/details/7619383 软件包 java.lang.management 提供管理接口,用于监视 ...

  5. Comet OJ - Contest #4 B题 奇偶性

    题目链接:https://www.cometoj.com/contest/39/problem/B?problem_id=1577 题意:给你一个数列,求L 到 R 区间内 所有数列 (ƒn mod ...

  6. 一文看懂SATA和NVMe固态硬盘用起来有何区别?

    本文摘自:https://www.sohu.com/a/203688929_615464 NVMe固态硬盘正在逐步扩张,而包括三星.东芝在内的大厂并没有停止SATA固态硬盘新品的研发.到底那种固态硬盘 ...

  7. C# WinForm 访问webService天气预报

    1.直接添加服务引用 右键引用 -->添加服务引用 这样的好处是可以直接当成类用 简单 麻烦的地方就是地址是死的 代码如下: private void button1_Click(object ...

  8. 根据不同运行环境配置和组织node.js应用

    安装node-config模块 npm install config --save || yarn add config mkidr config // 创建config文件夹 在config文件夹下 ...

  9. 【HDUOJ】4280 Island Transport

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意:有n个岛屿,m条无向路,每个路给出最大允许的客流量,求从最西的那个岛屿最多能运用多少乘客到 ...

  10. (数据科学学习手札61)xpath进阶用法

    一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...