JavaScript中逗號運算符和this

遇到一道題目,寫出下面的輸出:

wKioL1WqNTrzBr2dAAErXTaksLM774.jpg

結果如下:

wKioL1WqNdizNEN-AABALOyVSeI532.jpg

    第一個是child's name沒有問題,第二個指定的也是child,依然是child's name,第三個和第二個實際上是一樣的,(parentObj.child=parentObj.child)相當於(parentObj.child),都是函數名,第四個又是什麼鬼呢。

    逗號運算符是很少見的,查了資料才知道,使用逗號運算符時,先計算左操作數的值,再計算右操作數的值,最後返回右操作數的值。因此,(parentObj.child,parentObj.child)和前三個都是一樣的。逗號運算符的優先級在JavaScript中是最低的,如果使用要用括號包起來,不然容易出錯。然而,我覺得逗號運算符很少被使用。

    《JavaScript高級程序設計(第3版)》上有這麼一個例子:

wKiom1W5w7GifHwqAADXeC3CDbc458.jpg

    

    結果爲:

wKioL1W5xd3iUGD1AAAU8XUAeug967.jpg

    書上的解釋是,賦值表達式和逗號表達式的值是函數本身,this的值不能得到維持。


    再看一個在網上找的例子瞭解this的用法:

wKioL1WqPmbzsrElAAC9FUsxOlQ326.jpg

    結果是

wKioL1WqPzzywxa8AABPl0eGjMA546.jpg

    fn();之後爲什麼this.length是10呢,因爲fn這個函數是在全局定義的,fn函數的this指向的是Window,如你所見。

    大道理我都懂,arguments[0]();又是什麼鬼?

    arguments是JavaScript的一個內置對象,注意它並不是一個數組,而是對象。

    所以arguments[0]是想找到key爲0的value,這個value就是函數名fn,因爲它是第一個參數,好了,那這裏fn的this就只能指向argument了,因爲fn本身沒有length這個變量,往外面找就找到arguments了。arguments裏面有個length屬性,不信我展開最後的function給你看:

wKioL1WqQdPD1PjXAABb2I_fa0w923.jpg

    好了,真相大白,此時this.length爲1,length表示的應該就是參數的個數了,這裏只有fn,爲1

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章