原文地址: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. jQuery的属性、遍历和HTML操作

    一.属性操作   1..attr()与.removeAttr() 每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息.如:在img元素中,src就是元素的特性,用来标记图 ...

  2. SCP-bzoj-1068

    项目编号:bzoj-1068 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 区间DP.f[l][r][s]表示l到r的子串能最小被压成的长度,其中s∈[0,1]表示该串压缩后串中是否能含有M ...

  3. /etc/fstab修改及mkfs(e2label)相关应用与疑问

    http://blog.chinaunix.net/uid-23392298-id-62318.html 我们将以问题开始说明: 案例: 由于n年前的误操作,导致系统启动的时候,提示如下错误:Coul ...

  4. 第一次安装hadoop记录

    需求是:安装hadoop连接远程hadoop文件系统.JDK和hadoop需要与集群版本一致 首先去官网下载hadoop http://archive.apache.org/dist/hadoop/c ...

  5. js获取url中的中文参数出现乱码

    解决方法 function getQueryString(key){ var reg = new RegExp("(^|&)"+key+"=([^&]*) ...

  6. msgbox用法

    http://www.w3school.com.cn/vbscript/func_msgbox.asp VBScript MsgBox 函数 VBScript 函数参考手册 定义和用法 MsgBox ...

  7. 机器学习技法笔记:02 Dual Support Vector Machine、KKT

    原文地址:https://www.jianshu.com/p/58259cdde0e1 Roadmap Motivation of Dual SVM Lagrange Dual SVM Solving ...

  8. 51nod1787最大子方阵

    51nod1787最大子方阵 我在51nod上面切的第一道题 我在51nod上面切的第一道8级题 我在51nod上面切的第一道8级题的一血 题目大意 有一个n*m的矩阵,矩阵中的每一个元素是'X'或者 ...

  9. 5、cesium点击面高亮事件

    cesium点击面高亮事件 主要功能:比如你加载了json.geojson或者topojson的数据.加载出来后,分为很多个面,现在要实现点击一个面,这个面变颜色:再点击另一个面,另一个面高亮,之前的 ...

  10. testNG官方文档翻译-4 运行TestNG

    TestNG可以通过不同的方法触发运行: 命令行 ant Eclipse IntelliJ's IDEA