在javascript中對於this指向的再次理解
阿新 • • 發佈:2017-05-23
全局變量 依據 兩個 uem rip 二次 第一個 定義 無法
總所周知,function () {}函數體內的this對象指向的是調用該函數的對象,那麽我們看一下這個例子
<script> var length = 3; function fn () { console.log(this.length) } fn(); </script>
函數調用是在最外層發生的,那麽由於全局對象this的存在,那麽函數體內的this指向的就是window對象。
在瀏覽器環境下,全局變量和window對象的屬性是等價的,所以定義了length全局變量就相當於向window對象
添加了一個length屬性。即上面代碼的輸出結果是3
下面我們再看一個例子
<script> var length = 10; function fn() { console.log(this.length); } function test(fn) { fn(); arguments[0](); } test(fn, 3); </script>
第一個輸出的結果是10,大家應該都知道。第二個的輸出結果是2!!!為什麽呢?這裏還要強調上面說的那句話
function () {}函數體內的this對象指向的是調用該函數的對象。在function函數體內的有一個很神奇的對象arguments
這個對象是由調用該函數時所傳的實參決定的,而不是由定義函數時由形參決定的。這一點也是javascript語言廣為詬病的一
點,無法依據定義函數的形參個數來實現方法的重載,只能靠argumengs的length屬性來實現。所以在上面例子中,fn 和 3
這兩個變量都掛載在arguments對象下面,還由於arguments是一個類數組對象所以它有length屬性,也可以像使用數組一樣
來使用arguemnts。即可以arguments[0]指向arguments的第一個屬相,在上例中就指向了fn函數,fn函數體內的this就指向
了arguments對象,所以第二次打印出2!!!
在javascript中對於this指向的再次理解