遇到一道題目,寫出下面的輸出:
結果如下:
第一個是child's name沒有問題,第二個指定的也是child,依然是child's name,第三個和第二個實際上是一樣的,(parentObj.child=parentObj.child)相當於(parentObj.child),都是函數名,第四個又是什麼鬼呢。
逗號運算符是很少見的,查了資料才知道,使用逗號運算符時,先計算左操作數的值,再計算右操作數的值,最後返回右操作數的值。因此,(parentObj.child,parentObj.child)和前三個都是一樣的。逗號運算符的優先級在JavaScript中是最低的,如果使用要用括號包起來,不然容易出錯。然而,我覺得逗號運算符很少被使用。
《JavaScript高級程序設計(第3版)》上有這麼一個例子:
結果爲:
書上的解釋是,賦值表達式和逗號表達式的值是函數本身,this的值不能得到維持。
再看一個在網上找的例子瞭解this的用法:
結果是
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給你看:
好了,真相大白,此時this.length爲1,length表示的應該就是參數的個數了,這裏只有fn,爲1。