(一)
關於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 是如何進行編碼的,我嘗試將一些漢字...