js call 以及apply

用实例来讲;一半什么场合用到bind、call、apply呢?

【一个对象 A】的方法被【另一个对象 B】【引用】的时候(请注意 引用 的意思,区分调用 );【对象A】的方法内的this作用域就不指向【对象A】了,这个时候你再用this.XX项调用【对象A】的某个属性就会发生错误。

举个例子吧;

var aHello = {
    name : "hello",
    showName : function(){
        console.log(this.name);
        //console.log(this.tagName);
    }
}

document.querySelector(‘a‘).onclick = aHello.showName;

这个时候因为【对象aHello】的方法showName被【对象document.querySelector(‘a‘)】引用,所以showName内的this就不指向【aHello】了,指向【对象document.querySelector(‘a‘)】,可以去掉注释进行验证。

但是我们的需求是,点击a的时候就显示aHello的名称。

这个时候该怎么做呢?

方法一:在onclick的时候改用匿名函数,匿名函数内再调用 【对象aHello】的方法;
如:

var aHello = {
    name : "hello",
    showName : function(){
        console.log(this.name);
    }
}

document.querySelector(‘a‘).onclick = function(){
    aHello.showName();
}

ok!开心的解决了;

然而,是不是觉得太怂了。我们来衍生一下第二种方法,然后再说bind和call和apply的区别;

方法二:因为引用, onclick改变了【对象aHello】showName内this的指向。所以我们必须在【引用】的时候对showName方法进行重新绑定新的指向;
如:

var aHello = {
    name : "hello",
    showName : function(){
        console.log(this.name);
    }
}

document.querySelector(‘a‘).onclick = aHello.showName.bind(aHello);

恩!高大上,不用写太多代码。

接下来讲一下bind和apply、call的区别;
首先这些方法多属于【原型prototype】的方法。

题主的老师 可能没听过【引用】与【调用】所以用了一个临时与永久的概念来讲解,做技术,最好不要听老师的......

还用前面例子来讲(随便举的主要区分区别,大家别挑刺);

var aHello = {
    name : "hello",
    setYourAge : function(name,age){
       console.log(name);
       console.log(age);
    }
}

document.querySelector(‘a‘).onclick = aHello.setYourAge.call(aHello,‘王佳欣‘,25);

这个时候你可以看到打开页面,浏览器控制台就会马上输出 “王佳欣”,“25”;
然后,你再点击的时候,根本不会,再输出的;ok,这就是 【调用】含义;
call和apply是调用对象方法的意思;也就是说下面的3句代码其实实现是一样的;

aHello.setYourAge.call(aHello,‘王佳欣‘,25);
aHello.setYourAge.apply(aHello,[‘王佳欣‘,25]);
aHello.setYourAge(‘王佳欣‘,25);

既然可以直接调用干嘛还要call、apply方法呢,我先说一下call、apply 和bind的区别吧;

var aHello = {
    name : "hello",
    setYourAge : function(name,age){
       console.log(name);
       console.log(age);
    }
}

document.querySelector(‘a‘).onclick = aHello.setYourAge.bind(aHello,‘王佳欣‘,25);

bind的作用是【引用】,这个时候你打开浏览器控制台不会有输出。你点击a 标签的后,才会有输出,点一次,输出一次。
粗暴一点说,这就是区别马上【调用】和【引用】的区别。

上面我们说到,下面三局代码实现是一样的。那么call、apply有什么作用呢?

aHello.setYourAge.call(aHello,‘王佳欣‘,25);
aHello.setYourAge.apply(aHello,[‘王佳欣‘,25]);
aHello.setYourAge(‘王佳欣‘,25);

call、apply有什么作用
大家开发中是不是有这样的需求(我总是喜欢用需求来作为入口)
我们经常会在我们项目中做一些通用的对象,这些对象用来处理我们的一些通用的过程。比如:通用验证方法;(注:很多人喜欢用 继承的基础类 来作为例子.....我一时想不到好的继承例子,就用通用类的例子吧!)

/*通用验证对象*/
var validator = {
    validateName : function(){
         console.log(this.name);
    },
    validateAge  : function(){
         console.log(this.age)
    }
    //.....
}

大家可以看到我们的 【通用对象validator】内,是没有定义属性(name、age)的。

这个时候比如我们有两个对象需要验证;

/*对象kobe*/
var kobe = {
    name : ‘kobe bryant‘,
    age  : -1
}

/*对象 allen*/
var allen = {
    name : ‘allen iverson‘,
    age  : 10
}

那我们调用验证的时候就需要用到call或者apply了
如:

var isKobeAgeValid = validator.call(kobe);

var isAllenAgeValid = validator.call(allen);

额!差不多了了.....

转载自 王佳欣
链接:http://www.zhihu.com/question/20289071/answer/93261557
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

时间: 2024-08-06 19:31:26

js call 以及apply的相关文章

js 的 call apply bind 方法

js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context) call call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) thisObj可选项.将被用作当前对象的对象.arg1, arg2, argN ..可选项.将被传递方法参数序列. 如果没设置严格模式 “use strict” 当thisObj 不存在或 为 undefined 或为 null 或为 this 时,则隐式地指向 全局对象(在浏览器中即为 wi

js call() 和apply() 理解

 1. call() 和apply() 作用: 因为js没有私有类的概念,我们在做组件开发的时候经常会用到这两个方法来实现你的组件,理解这个同时也有助于理解js"this"的取值(是执行上下文环境的一部分) 2.call() 和apply() 来源: call()和apply() 是Function()的成员方法,其他方法是通过"--proto--"(隐式原型)继承Function()得到的. ; 3.call() 和apply() 区别: 本质上来个东西是一样的,

JS call与apply

JS的call与apply call和apply是JS中比较重要的两个方法, 一般在框架和组件设计中用的较多,比如jQuery Code. 那么这两个方法是做什么的呢,下面我们通过代码来了解: 1 function f(){ 2 console.log(this.name); 3 } 4 5 var obj = {}; 6 obj.name = "obj"; 7 8 f.call(obj); //obj f()中输出了this.name, 这里的this指的是函数在运行时的调用者(关于

js中的apply、call、callee、caller的区别

1.apply与call的区别与使用 相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象.作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数.通常用于改变调用的函数中this的指向.如果不传对象或者传入的为null,那么默认对象就是window. 不同点:第2个参数,为调用的函数的参数,区别是apply要求所有函数的参数放在一个数组中传递. 使用方法: fun.call(thisArg[, arg1[, arg2[, …]]]) fun.apply(thi

js call和apply

function add(a,b) { alert(a+b); } function sub(a,b) { alert(a-b); } add.call(sub,3,1); 例1 例子1中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用. var ary=[3,1]; function add(a,b) { alert(a+b);

js 中的apply

之一------(函数的劫持与对象的复制)关于对象的继承,一般的做法是用复制法: Object.extend 见protpotype.js 的实现方法: Object.extend = function(destination, source) ...{    for (property in source) ...{      destination[property] = source[property];    }    return destination;  } 除此以外,还有一种不太

js中的apply 和 call

A.call(B),意思就是把A的上下文(一般是this)借给B用Array.prototype.slice.apply,意思就是把数组对象的slice方法,借给apply第一个参数所指定的对象使用apply第一个参数必须是对象,哪怕是null 所以 Array.prototype.slice.apply(abc) ,就相当于把slice借给abc这个对象(JS里函数也是对象)使用.因为函数是没有slice方法的,直接调用 abc.slice 是要报错的

js: this,call,apply,bind 总结

对js中的一些基本的很重要的概念做一些总结,对进一步学习js很重. 一.this JavaScript 中的 this 总是指向一个对象,而具体指向那个对象是在运行时基于函数的执行环境动态绑定的,而非函数声明时的环境     实际应用中 this 的指向大致可以分为以下 4 中:         1. 作为对象的方法调用         2. 作为普通函数掉用         3. 构造器调用         4. Function.prototype.call 或 Function.proto

js知识梳理--apply()使用详解

转载:原文地址:http://blog.csdn.net/business122/article/details/8000676 Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家分享.. 如有什么不对的或者说法不明确的地方希望读者多多提一些意见,以便共同提高.. 主要我是要解决一下几个问题: 1.apply和call的区

js的call,apply,bind的使用与区别

在原生js中会有三个很常见的函数,call,apply,bind 他们的作用就是改变当前函数的this指针, 但是细微来说他们还是有不同的. 1)call,apply都是执行某一函数,发现this有变得时候才使用的(进行时) 2)bind是在函数进行调用之前,就强行给变了this的指向(进行前),它的效果是返回一个函数(只是给变了this指向) 说的很多了,不说了 demo : function Foo(name){ this.name=name; } Foo.prototype.getName