浅谈call , apply ,bind 的 差异

---恢复内容开始---

//首先这三个的根本作用都是改变this的指向,这个你必须明确

先说call //首先用单列模式声明一个对象;里面有个fn的方法,很简单,就是返回a里面的name;

var a = {

name : ‘极速代码‘,

fn:function(){

return this.name;

}

};

a.fn()       //-->输出是 ‘极速代码’ ,这个毫无疑问;

var b = a.fn;      //声明一个对象b;让他等于a里面的这个fn方法;

b();       //那么这时候如果我们执行b();就会提示b这个方法不存在 b is not a function;为什么?原因是这样的,name这个属性是在a里面的,a执行的时候this就是a本身,所以可以调用,而b()执行,这里面的this就变成了b,所以无法调用a下面的name,所以 我们要做的就是改变b方法执行的时候this的指向,让它指向a,这么做

b.call(a)-->输出 ‘极速代码‘

再举个例子,大家肯定更加明白;声明对象a,b,他们里面都有一个叫name 的私有属性;

var a = {

name : ‘极速代码‘,

fn:function(){

return this.name;

}

};

var  b = {

name:‘极速个啥‘

}

b.fn = a.fn //让b里面也有a里面的fn;

b.fn() //--->输出的是 ‘极速个啥‘

b.fn.call(a)-->输出的是‘极速代码’因为现在的this是指向a了。所以找到的是a里面的name属性;

apply 跟call基本相似,只是apply只能最多传2个参,第一个是this指向,第二个是一个数组;看例子:改变this指向跟call一样,下面就说他们传参的区别

var a = {

name:‘极速代码‘,

fn:function(n,m){

return this.name + n+m ;

}

};

a.fn(1,3) //--输出 ‘’极速代码4‘’;这没问题

var b = a.fn;

b(1,3)  // 提示b is not a function,因为没有改变this指向;

b.apply(a,[1,3]) //-->输出极速代码4;

b.call(a,1,3) // -->输出极速代码4;这两个大家灵活运用,如果需要传参是一个数组,或者很多就可以用apply;

另外一点就是如果第一个参数没有传或者传个null,this默认指向window

var name = ‘极速代码,极速个啥‘

var a = {
name:‘极速代码‘,
fn:function(n,m){
return this.name + n+m ;
}
}

var b = a.fn

b.call(null,1,3) //-->输出"极速代码,极速个啥13"this.指向了window,自然找的name是全局环境下的name;

bind 也是改变this指向,跟call,apply有明星区别,bind顾名思义,就是把this指向改变,然后绑定,但没有执行,看例子;

var a = {

name:‘极速代码‘,

fn:function(n,m){

return this.name + n+m ;

}

};

var b = a.fn;

b.bind(a,1,3); //没有输出任何东西;因为只是改变了this指向,并没有执行函数,

b.bind(a,1,3)(); //输出 ‘极速代码13’

到这里相信大家对这三者有了一定的了解,一定要从本质上了解他们。

---恢复内容结束---

时间: 2024-11-02 21:49:40

浅谈call , apply ,bind 的 差异的相关文章

浅谈call apply bind的区别

这三个方法的用法非常相似,将函数绑定到上下文中,即用来改变函数中this的指向.举个例子: var zlw = { name: "zlw", sayHello: function (age) { console.log("hello, i am ", this.name + " " + age " years old"); } }; var xlj = { name: "xlj", }; zlw.sayHe

浅谈 pid的原理与差异

pid  官方语言就是:比例   积分 微分.究其本质意义,比例到底是什么,原理是什么,这三个到底如何在物理世界这种运作的,大概了解的人又很少.过惯了拿起数据公式无脑推的日子的人更是如此,数学公式是很有用的,大部分不会质疑,也不会思考为什么这样,也没人问数学本质是什么?这样脱离实际 在运用实际情况的时候,就是一头雾水,公式如果起作用就可以,补齐作用就无脑推,借助公式顺口溜什么的,往往会比较头大. 今天不会讨论数学是什么,也不讨论宇宙的起源...只是讲解一下我对pid的理解和实际运用中的理解,当然

浅谈javascript继承【读javascript设计模式第四章节继承有感】

javascript继承,无任是类式继承,原型式继承还是渗元式继承都是通过不同方法去围绕着prototype转,简单分析下三种不同继承方法是如何围绕prototype转的 一:类似继承,先上关键代码 function extend(subClass,supClass){ var fn = function(){}; fn.prototype = supClass.prototype; subClass.prototype = new fn(); subClass.prototype.constr

浅谈移动前端的最佳实践(转)

前言 这几天,第三轮全站优化结束,测试项目在2G首屏载入速度取得了一些优化成绩,对比下来有10s左右的差距: 这次优化工作结束后,已经是第三次大规模折腾公司框架了,这里将一些自己知道的移动端的建议提出来分享下,希望对各位有用 文中有误请您提出,以免误人自误 技术选型 单页or多页 spa(single page application)也就是我们常常说的web应用程序webapp,被认为是业内的发展趋势,主要有两个优点: ① 用户体验好 ② 可以更好的降低服务器压力 但是单页有几个致命的缺点:

浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)——requirejs + angular + angular-route>探讨了angular+requirejs的一个简单架构,这一篇继续来看看backbone如何跟requirejs结合. 相同地,项目架构好与坏不是说用了多少牛逼的框架,而是怎么合理利用框架,让项目开发更流畅,代码更容易管理.那么带着这个目的,我们来继续探讨backbone. 首

call,apply,bind

call,apply,bind 一.call&apply call, apply都属于Function.prototype的方法,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性啦. 如果不明白,请见“Javascript之一切皆为对象3”. 而且它们的作用都是一样的,只是使用方式不同而已. 作用:借用别人的方法来调用,就像自己有这个方法一样. 咦,那它们怎样才能达到这目的呢? 对象. 对象? 是的,其实就是改变执行上下

浅谈JDK的File.equal()

我们一般比较两个文件对象是否同一个文件,一般会使用java.io.File.equal().这里所说的equal()并不是比较文件内容是否一样,而是看两个文件对象是否指向同一个文件. File的equal()方法,实际上调用了当前文件系统FileSystem的compareTo(). public boolean equals(Object obj) { if ((obj != null) && (obj instanceof File)) { return compareTo((File

浅谈自然语言处理基础(下)

命名实体识别 命名实体的提出源自信息抽取问题,即从报章等非结构化文本中抽取关于公司活动和国防相关活动的结构化信息,而人名.地名.组织机构名.时间和数字表达式结构化信息的关键内容,所以需要从文本中去识别这些实体指称及其类别,即命名实体识别和分类. 21世纪以后,基于大规模语料库的统计方法成为自然语言处理的主流,以下是基于统计模型的命名实体识别方法归纳: 基于CRF的命名实体识别方法 基于CRF的命名实体识别方法简便易行,而且可以获得较好的性能,广泛地应用于人名.地名和组织机构等各种类型命名实体的识

管理从砖瓦进化为人——浅谈传统软件工程到敏捷软件开发之变革

管理从砖瓦进化为人 --浅谈传统软件工程到敏捷软件开发之变革 前言 如果把软件开发过程比作修筑一座建筑的话,传统的软件工程方法对人的管理就像是把人化作一砖一瓦,秩序地堆砌,一层一层构建起摩天大厦. 显然地,人是不同于砖瓦那样的死物的.人作为一种复杂的动物,软件开发者会有喜怒哀乐,枯燥重复的工作内容会使他们提不起兴趣而缺乏激情:客户想法会随变动的现实而一天天有所转变,软件需求很难保持一成不变:开发者与测试者对于项目的认识会存在差异,而差异将导致效率的降低--因而传统的有些"反人类天性"的