看板 Ajax 關於我們 聯絡資訊
各位好: 以下程式碼: var obj = { foo: (function() { return this; }).bind(obj) }; obj.foo(); //Window{...} 我的想法是, foo已經有使用bind函式, 指定thisArg為obj物件, 所以, foo函式回傳的this應該要是obj這個物件, 怎麼會變成Window? 煩請解惑,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 116.118.69.178 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1555093875.A.BDB.html
mackliu: var obj = { foo: (()=> this).bind(obj)};obj.foo(); 04/13 09:37
mackliu: 你用匿名函數時,this指的是匿名函數自己,而不是obj 04/13 09:38
mackliu: 使用箭頭函數的話..this 指的是定義時的obj 04/13 09:39
mackliu: 詳情找一下javascript 的this用法..或者你在匿名函數前先 04/13 09:40
mackliu: 最後一句先略過..有不同的做法,但要看狀況 04/13 09:47
mackliu: 哦..丟臉了..不要理我... 04/13 10:21
brianwu1201: 你 bind(obj) 時 obj 物件還沒被建立完成,所以()裡 04/13 10:54
brianwu1201: 面的 obj 這時會是 undefined,當bind(undefined) th 04/13 10:54
brianwu1201: is 會指向全域變數。 04/13 10:54
s25g5d4: 這問題要從 variable hoisting 開始,在 compile phase o 04/13 12:50
s25g5d4: bj 會先被初始化成 undefined,然後因為你在 assignment 04/13 12:50
s25g5d4: expression 計算完成之前就呼叫 .bind(),又因為 javascr 04/13 12:50
s25g5d4: ipt 是 call by sharing 所以此時傳進 bind 的會是 undef 04/13 12:50
s25g5d4: ined,即使後來 assignment 完成之後也不會影響傳進 .bin 04/13 12:50
s25g5d4: d() 裡的 argument,所以實際上你等於呼叫了 .bind(undef 04/13 12:50
s25g5d4: ined) 04/13 12:50
icydream: 感謝各位回答 04/13 14:44
thethirdfoot: 你可以加上嚴謹模式 跑出來的就會是undefined 05/13 12:13
thethirdfoot: bind執行的時候obj都還沒初始化 所以會變undefined 05/13 12:14
thethirdfoot: 但是沒有嚴謹模式他會自動導向Window 05/13 12:14