[問題] bind自己

看板Ajax作者 (巧虎)時間5年前 (2019/04/13 02:31), 編輯推噓3(3017)
留言20則, 5人參與, 5年前最新討論串1/1
各位好: 以下程式碼: 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

04/13 09:37, 5年前 , 1F
var obj = { foo: (()=> this).bind(obj)};obj.foo();
04/13 09:37, 1F

04/13 09:38, 5年前 , 2F
你用匿名函數時,this指的是匿名函數自己,而不是obj
04/13 09:38, 2F

04/13 09:39, 5年前 , 3F
使用箭頭函數的話..this 指的是定義時的obj
04/13 09:39, 3F

04/13 09:40, 5年前 , 4F
詳情找一下javascript 的this用法..或者你在匿名函數前先
04/13 09:40, 4F

04/13 09:47, 5年前 , 5F
最後一句先略過..有不同的做法,但要看狀況
04/13 09:47, 5F

04/13 10:21, 5年前 , 6F
哦..丟臉了..不要理我...
04/13 10:21, 6F

04/13 10:54, 5年前 , 7F
你 bind(obj) 時 obj 物件還沒被建立完成,所以()裡
04/13 10:54, 7F

04/13 10:54, 5年前 , 8F
面的 obj 這時會是 undefined,當bind(undefined) th
04/13 10:54, 8F

04/13 10:54, 5年前 , 9F
is 會指向全域變數。
04/13 10:54, 9F

04/13 12:50, 5年前 , 10F
這問題要從 variable hoisting 開始,在 compile phase o
04/13 12:50, 10F

04/13 12:50, 5年前 , 11F
bj 會先被初始化成 undefined,然後因為你在 assignment
04/13 12:50, 11F

04/13 12:50, 5年前 , 12F
expression 計算完成之前就呼叫 .bind(),又因為 javascr
04/13 12:50, 12F

04/13 12:50, 5年前 , 13F
ipt 是 call by sharing 所以此時傳進 bind 的會是 undef
04/13 12:50, 13F

04/13 12:50, 5年前 , 14F
ined,即使後來 assignment 完成之後也不會影響傳進 .bin
04/13 12:50, 14F

04/13 12:50, 5年前 , 15F
d() 裡的 argument,所以實際上你等於呼叫了 .bind(undef
04/13 12:50, 15F

04/13 12:50, 5年前 , 16F
ined)
04/13 12:50, 16F

04/13 14:44, 5年前 , 17F
感謝各位回答
04/13 14:44, 17F

05/13 12:13, 5年前 , 18F
你可以加上嚴謹模式 跑出來的就會是undefined
05/13 12:13, 18F

05/13 12:14, 5年前 , 19F
bind執行的時候obj都還沒初始化 所以會變undefined
05/13 12:14, 19F

05/13 12:14, 5年前 , 20F
但是沒有嚴謹模式他會自動導向Window
05/13 12:14, 20F
文章代碼(AID): #1SiDbplR (Ajax)
文章代碼(AID): #1SiDbplR (Ajax)