bind 方法模擬時的arguments
我有些不太理解兩個 arguments 的變化,
demo:
function?foo(x,y,z){ ??this.b?=?100; ??return?this.a+x+y+z; } var?func?=?foo.bind({a:1},20); func(3,4);
這個時候對于截圖右邊實現bind 模擬的代碼而言,
var?aArgs?=?Array.prototype.slice.call(arguments,1);??//此時的arguments[0]->{a:1} ?????????????????????????????????????????????????????//arguments[1]->20
而fBound 的匿名函數中
aArgs.concat(Array.propotype.slice.call(arguments))??//此時的arguments[0]->3 ????????????????????????????????????????????????????//arguments[1]->4
我感覺這樣理解才是對的,這樣 concat 之后返回的是 [20,3,4]
但是我不太明白fBound 的匿名函數中的 arguments 是何時指向函數調用的?
2015-06-05
非常認真的總結,很不錯。加油哦。有問題可以微博艾特我@Bosn
2015-05-19
額, 自己犯傻了!!
自問自答之前先重申一下:標識符 arguments 是指向 【實參】 對象的引用。
也就是說,必須 【在函數調用,傳入了實參時,才有 arguments 對象】。
demo:
其中,
在Chrome 的控制臺下模擬了一下,注意兩點:
此時call stack(紅色框) 里面是 第33 行調用 .mybind() 方法調用了第14行
第 20 行,也就是最后返回的函數的 arguments(藍色框) 也是[{a:1},20],但此時這個函數 【沒有調用】,沒有執行也就沒有輸出效果。
.mybind() 返回一個函數,保存在 func 里面,現在 func 里面是 .bind() 方法返回的函數,里面的內容也就是這一段,
當調用 func 函數,或者說是在調用 .mybind() 方法的返回值時,
此時在Chrome 中斷點,可以看到
call stack(紅色框) 中第 34 行, func(3,4) 調用的是 fBound 方法,也就是 18-19 行的代碼
此時整個 Local 的 arguments(藍色框) 都是[3,4] ,即使是被調用的函數外部(即第14行)的 arguments 也是[3,4]
此時實際上是在間接調用 foo() 函數,其參數分別為 oThis 和?aArgs.concat(Array.prototype.slice.call(arguments))
閉包(紫色框)中可以看到?oThis 和 aArgs 仍然存在