(一)關於this
首先關於this我想說一句話,這句話記住了this的用法你也就差很少都能明白了:this指的是當前函數的對象。這句話可能比較繞,我會舉出不少例子和這句話呼應的!(看下文)
1.首先看下面這段代碼, 定義一個函數,彈下this,數組
- function doSomething(){
- alert(this);
- }
- doSomething();
那麼這個 [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方法裏,而不是那個匿名函數裏不就能夠了嗎?修改代碼以下:
app
- 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是調用一個數組。仍是用上面相同的例子:
this
- 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的用法。spa