JS 中this、call、apply的用法

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


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

我是在firefox里面调试的,所以返回的结果是[Object Window]。那么这个 [Object Window], 到底是什么呢?看看下面的代码Js代码 !

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

看到弹出了true, 也就是说在这种正常情况下,this其实就是window所以,我们定义了一个全局的变量的时候,可以var test="Tony";也可以window["test"]="Tony";下面这个例子,进一步说明,正常情况下,函数里的this就是window
Js代码

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

第一次呼应:通过以上几个例子,我想可以说这几个例子中得this指的就是他当前函数doSomething()的Window对象。那顾名思义this.test自然就等于window.test了。事实也是如此。2.我再举一个闭包的例子,但是在这里我不会解释什么是闭包,只是讲this的用法,明天我会学习闭包,今天就先当他是一个未知数,来学习this的一个工具。 看这个例子:
Js代码


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方法里,而不是那个匿名函数里不就可以了吗?修改代码如下:
Js代码

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(); 代码如下:
Js代码


var test="Tony";  
function doSomething(){  
    alert(this.test);     //弹出 "Tony";  
}  
  
doSomething(); //   [调用]  doSomething();  
doSomething.call(); // 函数.调用()  

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


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.那如果里面有参数呢?看代码
Js代码


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是调用一个数组。还是用上面相同的例子:
Js代码


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的用法。

转:http://liuhd2010.iteye.com/blog/1894237

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 注:本文案例环境为非严格模式,严格模式下禁止关键字this指向全局对象 一、方法是怎么执行的? 首先说一下js中方...
    就那ck阅读 1,141评论 5 17
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,521评论 0 5
  • 参考《JavaScript设计模式与开发实践》 this 跟别的语言大相径庭的是,JavaScript的this总...
    16manman阅读 571评论 0 0
  • 小蚂蚁是定居在齐朵朵家楼下花圃的一只小蚂蚁。由于齐朵朵家在一楼,窗台外正对着小区花圃,因此小蚂蚁就那么偶然中带着必...
    撒欢的二狗子阅读 251评论 2 4
  • 浦东机场,今天来了一个不一样的女人。女人个子不高,身材挺好,穿着时尚 。走路像风一样,气场很大,在旁人眼里一看就不...
    乐瑞阅读 492评论 0 0