`
liuhd2010
  • 浏览: 145826 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

[转]js之this,call,apply用法

 
阅读更多

(一)关于this
首先关于this我想说一句话,这句话记住了this的用法你也就差不多都能明白了:this指的是当前函数的对象。这句话可能比较绕,我会举出很多例子和这句话呼应的!(看下文)
1.首先看下面这段代码, 定义一个函数,弹下this,

function doSomething(){
     alert(this);
}
doSomething();

 

我是在firefox里面调试的,所以返回的结果是[Object Window]。
那么这个 [Object Window], 到底是什么呢?看看下面的代码
function doSomething(){
     alert(this===window);
}
doSomething();
 
看到弹出了true, 也就是说在这种正常情况下,this其实就是window
所以,我们定义了一个全局的变量的时候,可以
var test="Tony";
也可以
window["test"]="Tony";
下面这个例子,进一步说明,正常情况下,函数里的this就是window
var test="Tony";
function doSomething(){
     alert(this.test);     //弹出 "Tony";
     alert(window.test);   //弹出 "Tony";
}
doSomething();
 

第一次呼应:通过以上几个例子,我想可以说这几个例子中得this指的就是他当前函数doSomething()的Window对象。那顾名思义this.test自然就等于window.test了。事实也是如此。

2.我再举一个闭包的例子,但是在这里我不会解释什么是闭包,只是讲this的用法,明天我会学习闭包,今天就先当他是一个未知数,来学习this的一个工具。
     看这个例子:
     

var name ="The Window";                     //创建了一个全局变量name
var object = {                       //又创建了一个对象(创建对象的方法有很多种)
      name:"My Object",                //创建了一个name属性(属性就是引用非函数)
      doSomething:function(){          //创建了一个doSomething方法(方法就是引用了函数)
             return function(){       //这个doSomething方法返回一个匿名函数
                  return this.name;    //这个匿名函数又返回this.name
          };
    }
};
alert(object.doSomething()());
                            //由于这个doSomething方法返回的一个函数,所以这样就可以调用这个函数了

 
     这段代码的主要解释我都注在了后面,主要想说的就是:这段代码返回的结果是"The Window",而不是我所预期的"My Object",前面不是说了吗? this指的是当前函数的对象, 可是在这里为什么就不是呢?其实就是因为闭包的特性,由于这个匿名函数构成了一个闭包,所以他所保存的就是整个变量对象也就是Window对象。这里先不说为什么,明天学闭包的时候我还会用这个例子的,这里就先接受下来。
     那么如何做才能让结果返回"My Object"呢?还是那句话
this指的是当前函数的对象,那么问题就简单了,也就是让this放在doSomething方法里,而不是那个匿名函数里不就可以了吗?修改代码如下:
    

var name ="The Window";                    
var object = {                      
     name:"My Object",              
     doSomething:function(){
           var abc = this ;        
           return function(){      
                  return abc.name;   
           };
      }
};
alert(object.doSomething()());

 
第二次呼应:现在再看代码红色部分做的修改,this是不是指的是当前doSomething()函数的object对象了?那再输出结果自然就是"My Object"了。
      通过这两次呼应,是不是感觉已经对this有了一定的了解呢,其实this用到的地方还很多,以后还会慢慢讲到,比如在jQuery中this依然指的是当前函数的对象。
(二)关于call
  
1.如果我们调用函数的时候,想让函数里的 this 代表别的对象,而不是当前函数的对象。有什么办法呢?那就只好使用call和apply了(对于我这种初学者,这两个东西太恶心了)                  
     通常我们调用函数,都是直接采用以下形式调用
     [调用] 函数名();  //doSomething();
     其实我们还可以采用其它方法, 比如 call 这个单词,就是调用的意思,我们这里要用到它。
还是以doSomething函数为例:
     中文:函数名.调用();
     英文:doSomething.call();
     代码如下:
    

var test="Tony";
function doSomething(){
    alert(this.test);     //弹出 "Tony";
}

doSomething(); //   [调用]  doSomething();
doSomething.call(); // 函数.调用()

 
现在我们只是做了函数的调用,还没有改变this那么怎么改变 this 呢?这个时候call就要发挥威力了。
本来doSomething函数里的this表示的是 window ,我们执行下面这句。
     doSomething.call(某个对象);
这个时候doSomething里的this就变成了"某个对象",看下面的例子:
     

var test="Tony";
var myobj={
    test : "Tom"
};
function doSomething(){
    alert(this.test);   
}
toolmao.call(); // 弹出 window.test   ,即 "Tony"
toolmao.call(myobj); // 这个时候,doSomething函数里的this指向 myobj,
                          //所以弹出的是 myobj.test 即 "Tom"

 
     2.那如果里面有参数呢?看代码
    

var test="Tony";
var myobj={
    test : "Tom"
};
function doSomething(name, age){
    alert(this.test + ":" + name + age);  
}

doSomething("Tony",23);//普通调用 结果Tony:Tony23
doSomething.call(myobj,"Tony",23);//call调用结果Tom:Tony23

 
上面代码,我们可以看出,相比普通调用, call 只是多了一个用来指定this的参数,call 干什么用的?就是干这个用的!!现在有体会了吧?
(三)关于apply
都知道call的用法了,apply其实是一个意思。只不过是调用参数的形式不一样罢了。
call是一个一个调用参数,而apply是调用一个数组。还是用上面相同的例子:
    

var test="Tony";
var myobj={
     test : "Tom"
};
function doSomething(name, age){
    alert(this.test + ":" + name + age);  
}
doSomething("Tony",23);//普通调用 结果Tony:Tony23
doSomething.call(myobj,"Tony",23);//call调用结果Tom:Tony23
doSomething.apply(object,["Tony",23]);//apply调用 结果与call相同

 
上面这写代码写红色部分就是apply的用法。

分享到:
评论
1 楼 hxc316 2015-11-22  

相关推荐

    JS中的call()和apply()方法的详解

    在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向 语法: apply() 接收两...

    javascript中apply和call方法的作用及区别说明

    1、call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为方法的属性,那它们的使用...

    JS中改变this指向的方法(call和apply、bind)

    this是javascript的一个关键字,随着函数使用场合不同,this的值会发生...但是总有一个原则,那就是this指的是调用函数的那个对象,通过本文给大家介绍JS中改变this指向的方法(call和apply、bind),需要的朋友参考下

    js中call与apply的用法小结

    前天去面试,有个gg问了一些js知识,其中有一道call与apply用法的题目,尽管在365天前用过call方法,但当时还是没能答上来,今天深入总结一下 call和apply,它们的作用都是将函数绑定到另外一个对象上去运行 两者的...

    js中apply与call简单用法详解

    call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。 call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现...

    javascript中call,apply,bind函数用法示例

    本文实例讲述了javascript中call,apply,bind函数用法。分享给大家供大家参考,具体如下: 一.call函数 a.call(b); 简单的理解:把a对象的方法应用到b对象上(a里如果有this,会指向b) call()的用法:用在函数上面 ...

    开启Javascript中apply、call、bind的用法之旅模式

    在Javascript中,Function是一种对象。Function对象中的this指向决定于函数被调用的方式,使用apply,call 与 bind 均可以改变函数对象中this的指向。

    JS中call和apply函数用法实例分析

    本文实例讲述了JS中call和apply函数用法。分享给大家供大家参考,具体如下: call 函数 语法 obj.call(thisObj,arg[,arg2[,arg3[,...agr]]]); 简介 thisObj继承obj的属性和方法(obj原型链上的属性和方法不能被继承),...

    Javascript 中的 call 和 apply使用介绍

    简单的说就是改变函数执行的上下文,这是最基本的用法。两个方法基本区别在于传参不同。 call(obj,arg1,arg2,arg3);call第一个参数传对象,可以是null。参数以逗号分开进行传值,参数可以是任何类型。 apply(obj,...

    简单对比分析JavaScript中的apply,call与this的使用

    apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数。 语法:apply([thisObj[,argArray]]) thisObj 可选。要用作 this 对象的对象。 argArray 可选。要传递到函数的一组参数。 2.call...

    javascript中call apply 与 bind方法详解

    在JavaScript中,call、apply和bind是Function对象自带的三个方法,本文将通过几个场景的应用,来详细理解三个方法。 call() call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法。 ...

    详解js中的apply与call的用法

    call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。 call 和 apply二者的作用完全一样,只是接受参数的方式不太一样。 方法定义 apply ...

    js中apply()和call()的区别与用法实例分析

    本文实例讲述了js中apply()和call()的区别与用法。分享给大家供大家参考,具体如下: 每个函数都包括两个非继承而来的方法:apply()和call()。两者用途都是在特定的作用域中调用函数,等于重新设置了函数体内this...

    Javascript中call和apply函数的比较和使用实例

    一些简单的Javascript操作中较少会用到call和apply函数,在另外一些较大型的操作中,如web应用开发,js框架开发中可能会经常遇到这两个函数。关于这两个函数的解释,网上的资料也很多,但是本人认为很多资料要么...

    JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题

    JavaScript对象与DOM对象进行绑定会遇到一个问题:如果被绑定的对象的方法中包含this关键字,当事件被触发时this指向的却是DOM对象,而不是之前的JS对象。

    JavaScript必知必会(十) call apply bind的用法说明

    call  每个func 都会继承call apply等方法。 function print(mesage) ...apply(thisAgr,[agr1,agr2]),apply方法和call的用法一样,只是传递的参数会有所不同。。 function print(a,b) { consol

    JavaScript中apply与call的用法意义及区别说明

    apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别: Function.prototype.apply(thisArg,argArray); Function.prototype.call(thisArg[,arg1[,arg2…]]); 从函数原型...

    javascript中call和apply方法浅谈

    例如,如果要想以对象o的方法来调用函数f,可以按如下的方式使用call和apply方法: 代码如下: f.call(o); f.apply(o);可以按如下的代码来理解: 代码如下: o.m = f; //将f存储为o的临时方法 o.m(); //调用这个...

    JavaScript this使用方法图解

    这篇文章主要介绍了JavaScript this使用方法图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本文我们介绍下js中this的用法。 由上图可得,默认this指向...

Global site tag (gtag.js) - Google Analytics