js call 和apply

   ECMAScript3  给Function原型上定义了两个方法,他们是Function.prototype.call和Function.prototype.apply。

  • call和apply的区别
 1 var func =function(a,b,c){
 2     alert([a,b,c]);
 3 };
 4 func.apply(null,[1,2,3]);//apply
 5
 6
 7 var func =function(a,b,c){
 8     alert([a,b,c]);
 9 };
10 func.call(null,1,2,3);//call

  apply::两个参数,第一个参数:指定了函数体内this对象的指向;

          第二个参数:一个带下标的集合,可以为数组,也可以为伪数组

  call:多个参数:第一个参数:指定了函数体内this对象的指向;

          第二个参数开始往后,每一个参数被依次传入函数;

  call和apply传入的第一个参数为null,函数体内this会指向默认的宿主对象,在浏览器中则是window

  如果在严格模式下,函数体内的this还是为null 1 var func = function(a,b,c){

 2     alert(this === window);//true
 3 };
 4
 5 func.apply(null,[1,2,3])
 6
 7 var func = function(a,b,c){
 8     "use stract";//如果在严格模式下,函数体内的this还是为null
 9     alert(this === null);//true
10 };
11 func.apply(null,[1,2,3]);
  • call和apply的用途

    1.改变this的指向 

 1 var obj1 = {
 2     name:"seven"
 3 };
 4
 5 var oj2 = {
 6     name:"anne"
 7 };
 8
 9 window.name = "window";
10
11 var getName = function(){
12     alert(this.name)
13 };
14
15 getName();//window
16 getName.call(obj1);//seven
17 getName.apply(obj2);//anne

在实际开发中,经常会遇到this指向被不经意改变的场景,比如,有一个div节点,div节点的onclick事件中的this本来指向这个div的:

 1 dcument.getElementById("div1").onclick=function(){
 2     alert(this.id);//div1
 3 }
 4 //加入改时间函数中有一个内部函数func,在实践内部调用func函数时,func函数体内的this就指向了window,而不是我们预期的div
 5
 6 document.getElementById("div1").oonclick = function(){
 7     alert(this.id);//div1
 8     var func = function(){
 9         alert(this.id)  //undefined
10     };
11     func();
12 };
13 //这时候我们用call来修正func函数内的this,使其指向div
14 document.getElementById("div1").onclick=function(){
15     var func = function(){
16         alert(this.id);//div1
17     };
18     func.call(this);
19 }   

使用call来修正this的场景,我们并不是第一次遇到,

1 document.getElementById = (function(){
2     return function(){
3         return func.apply(document,arguments);
4     }
5 })(document.getElementById);
6
7 var getId =document.getElementById;
8 var div = getId("div1");
9 alert(div.id);  //div1

    2.Function.prototype.bind

大部分浏览器都实现了内置的Function.prototype.bind,用来指定函数内部的this指向,即使没有原生的Function.prototype.bind实现。

 1 Function.prototype.bind= function(context){
 2     var self = this;//保存原函数
 3     return function(){//返回一个新函数
 4         return self.apply(context,arguments);//执行新的函数的时候,会把之前的context当做新函数体内的this
 5     };
 6 }
 7
 8 var obj = {
 9     name:"seve"
10 };
11
12 var a = function(){
13     alert(this.name);//seve
14 }.bind(obj);
15
16 a();

我们通过Function.prototype.bind来“包装”func函数,并且传入一个对象context当作参数,这个context对象就是我们想修正的this对象。

在Function.prototype.bind的内部实现中,我们先把func函数的引用保存起来,然后返回一个新函数。当我们在将来执行a函数时,实际上先执行的是这个刚刚返回的新函数。在新函数内部,self.apply(context,arguments)这句话代码是执行原来的a函数,并且指定context对象为a函数体内的this.

下面是复杂一点的实现:

  

时间: 2024-10-10 11:10: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