徹底讓我弄懂this,call,apply的文章

2021-06-28 22:25:41 字數 2877 閱讀 8892

(一)

關於this

首先關於this我想說一句話,這句話記住了this的用法你也就差不多都能明白了:this指的是當前函式的物件

。這句話可能比較繞,我會舉出很多例子和這句話呼應的!(看下文)

1.首先看下面這段**, 定義乙個函式,彈下this,

js**  

function dosomething()  

dosomething();  

我是在firefox裡面除錯的,所以返回的結果是[object window]。

那麼這個 [object window], 到底是什麼呢?看看下面的**

js**  

function dosomething()  

dosomething();  

看到彈出了true, 也就是說在這種正常情況下,this其實就是window

所以,我們定義了乙個全域性的變數的時候,可以

var test="tony";

也可以

window["test"]="tony";

下面這個例子,進一步說明,正常情況下,函式裡的this就是window

js**  

var test="tony";  

function dosomething()  

dosomething();  

第一次呼應

:通過以上幾個例子,我想可以說這幾個例子中得this指的就是他當前函式dosomething()的window物件。那顧名思義this.test自然就等於window.test了。事實也是如此。

2.我再舉乙個閉包的例子,但是在這裡我不會解釋什麼是閉包,只是講this的用法,明天我會學習閉包,今天就先當他是乙個未知數,來學習this的乙個工具。

看這個例子:

js**  

var name ="the window";                     //建立了乙個全域性變數name

var object = ;  

}  };  

alert(object.dosomething()());  

//由於這個dosomething方法返回的乙個函式,所以這樣就可以呼叫這個函式了

這段**的主要解釋我都注在了後面,主要想說的就是:這段**返回的結果是"the window",而不是我所預期的"my object",前面不是說了嗎? this指的是當前函式的物件,

可是在這裡為什麼就不是呢?其實就是因為閉包的特性,由於這個匿名函式構成了乙個閉包,所以他所儲存的就是整個變數物件也就是window物件。這裡先不說為什麼,明天學閉包的時候我還會用這個例子的,這裡就先接受下來。

那麼如何做才能讓結果返回"my object"呢?還是那句話

this指的是當前函式的物件,

那麼問題就簡單了,也就是讓this放在dosomething方法裡,而不是那個匿名函式裡

不就可以了嗎?修改**如下:

js**  

var name ="the window";                      

var object = ;  

}  };  

alert(object.dosomething()());  

第二次呼應:

現在再看**紅色部分做的修改,this是不是指的是當前dosomething()函式的object物件了?那再輸出結果自然就是"my object"了。

通過這兩次呼應,是不是感覺已經對this有了一定的了解呢,其實this用到的地方還很多,以後還會慢慢講到,比如在jquery中this依然指的是當前函式的物件。

(二)關於call

js**  

var test="tony";  

function dosomething()  

dosomething(); //   [呼叫]  dosomething();

dosomething.call(); // 函式.呼叫()

現在我們只是做了函式的呼叫,還沒有改變this那麼怎麼改變 this 呢?這個時候call就要發揮威力了。

本來dosomething函式裡的this表示的是 window ,我們執行下面這句。

dosomething.call(某個物件);

這個時候dosomething裡的this就變成了"某個物件",看下面的例子:

js**  

var test="tony";  

var myobj=;  

function dosomething()  

toolmao.call(); // 彈出 window.test   ,即 "tony"

toolmao.call(myobj); // 這個時候,dosomething函式裡的this指向 myobj,

//所以彈出的是 myobj.test 即 "tom"

2.那如果裡面有引數呢?看**

js**  

var test="tony";  

var myobj=;  

function dosomething(name, age)  

dosomething("tony",23);//普通呼叫 結果tony:tony23

dosomething.call(myobj,"tony",23);//call呼叫結果tom:tony23

js**  

var test="tony";  

var myobj=;  

function dosomething(name, age)  

dosomething("tony",23);//普通呼叫 結果tony:tony23

dosomething.call(myobj,"tony",23);//call呼叫結果tom:tony23

徹底弄懂session,cookie,token

我在寫之前看了很多篇session,cookie的文章,有的人說先有了cookie,後有了session。也有人說先有session,後有cookie。感覺都沒有講的很清楚,泛泛而談。希望本篇文章對大家有所幫助 注 本文需要讀者有cookie,session,token的相關基礎知識。什麼是無狀態呢...

讓你徹底弄懂Python中的集合

初學python時,有很多定義都比較模糊,不是特別理解,導致一到使用就卡殼。本文致力用最簡潔的語言 最清晰的例子,跟你一起理解python中的集合函式。三 集合的特點 四 集合的更新 五 集合的運算 六 總結 高中的時候我們就學過集合,python中的集合與之概念類似,又有不同。python中的集合...

徹底弄懂 Unicode 編碼

原文 今天,在學習 node.js 中的 buffer 物件時,注意到它的 alloc 和 from 方法會預設用utf 8編碼,在陣列中每位對應 1 位元組的十六進製制數。想到了之間學習 es6 時關於字串的 unicode 表示法,突然就很想知道 utf 16 是如何進行編碼的,我嘗試將一些漢字...