【Web】浅析JQuery的apply(), call(), bind()方法
原文地址: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方法中的thisfunction 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();//813.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);3104.bind与newfunction 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()方法的更多相关文章
- JS中的call、apply、bind方法
JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]] ...
- Javascript中call,apply,bind方法的详解与总结
在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,thi ...
- 深入理解jQuery中live与bind方法的区别
本篇文章主要是对jQuery中live与bind方法的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 注意如果是通过jq添加的层和对象一定要用live(),用其他的都不起作用 ...
- 理解JS中的call、apply、bind方法(*****************************************************************)
在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...
- 重写apply, call, bind方法
重写apply, call, bind方法 //原生JavaScript封装apply方法,第四版 Function.prototype.applyFour = function(context) { ...
- 简单模拟实现javascript中的call、apply、bind方法
目录 引子 隐式丢失 硬绑定 实现及原理分析 总体实现(纯净版/没有注释) 写在最后 引子 读完<你不知道的JavaScript--上卷>中关于this的介绍和深入的章节后,对于this的 ...
- JS中的call、apply、bind方法详解
bind 是返回对应函数,便于稍后调用:apply .call 则是立即调用 . apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(co ...
- javascript中函数的call,apply及bind方法
call 方法调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[, [,.argN]]]]])参数thisObj可选项.将被用作当前对象的对象. ...
- js中的call()、apply()和bind()方法的区别
call(thisObj,param1,param2....)方法:调用一个对象的方法,用另外的对象去替换当前对象. 下面给出一个例子: function add(a,b){ return a+b; ...
随机推荐
- SP7258 SUBLEX - Lexicographical Substring Search(后缀自动机)
传送门 解题思路 首先建\(sam\),然后在拓扑序上\(dp\)一下,把每个点的路径数算出来,然后统计答案时就在自动机上\(dfs\)一下,仿照平衡树那样找第\(k\)小. 代码 #include& ...
- 3.1 开始使用 redux
前面我们介绍了 flux 架构以及其开源实现 redux,在这一节中,我们将完整的介绍 redux: redux 介绍 redux 是什么 redux 概念 redux 三原则 redux Store ...
- vue-router 动态路由
上一篇文章我们已经配置好了路由,下面,来说说如何实现动态路由. 比如,我想在 news 页点击列表项,跳转到对应项,如图所示: 这里引用的数据是豆瓣电影,地址: http://api.douban.c ...
- jQuery全部选择器总结(转载)
jQuery选择器总结 不知道为什么博客园不能转载文章?如果知道如何转载的朋友可以评论告诉我,我只能ctrl+C/V下来,转载自: http://www.cnblogs.com/mcgrady/arc ...
- testNG官方文档翻译-1 简介
官方文档链接http://testng.org/doc/documentation-main.html 简介 TestNG是一个被设计用来简化广泛的测试需求的测试框架,它既可应用于单元测试(测试一个独 ...
- Hive实践(hive0.12)
版本号:cdh5.0.0+hadoop2.3.0+hive0.12 一.原始数据: 1. 本地数据 [root@node33 data]# ll total 12936 -rw-r--r--. 1 r ...
- md详解和rd详解:一次性创建多个目录和多级子目录
md 命令: 官方解释: E:\ABC>md /? 创建目录. MKDIR [drive:]path MD [drive:]path 如果命令扩展被启用,MKDIR 会如下改变: 如果需要,MK ...
- 从零开始搭建系统2.2——ELK安装及配置
ELK 最新版本对JDK的最低要求是1.8,安装java_1.8版本 一.Elasticsearch 1.创建目录 2.下载安装包 wget https://artifacts.elastic.co/ ...
- 笔记49 在Spittr应用中整合Hibernate
在前边构建的Spittr应用中整合Hibernate 由于最近所学的hibernate都是使用xml方式进行配置的,所以在与以Java方式配置的Spittr应用结合时就会出现一些小问题,在此进行总结. ...
- Simple example of use of __setstate__ and __getstate__
class Foo(object): def __init__(self, val=2): self.val = val def __getstate__(self): print ("I' ...