[问题] bind自己

楼主: icydream (巧虎)   2019-04-13 02:31:10
各位好:
以下程式码:
var obj = {
foo: (function() {
return this;
}).bind(obj)
};
obj.foo(); //Window{...}
我的想法是,
foo已经有使用bind函式,
指定thisArg为obj物件,
所以,
foo函式回传的this应该要是obj这个物件,
怎么会变成Window?
烦请解惑,谢谢。
作者: mackliu (回不去的大叔)   2019-04-13 09:37:00
var obj = { foo: (()=> this).bind(obj)};obj.foo();你用匿名函数时,this指的是匿名函数自己,而不是obj使用箭头函数的话..this 指的是定义时的obj详情找一下javascript 的this用法..或者你在匿名函数前先最后一句先略过..有不同的做法,但要看状况哦..丢脸了..不要理我...
作者: brianwu1201 (bunny29)   2019-04-13 10:54:00
你 bind(obj) 时 obj 物件还没被建立完成,所以()里面的 obj 这时会是 undefined,当bind(undefined) this 会指向全域变量。
作者: s25g5d4 (function(){})()   2019-04-13 12:50:00
这问题要从 variable hoisting 开始,在 compile phase obj 会先被初始化成 undefined,然后因为你在 assignmentexpression 计算完成之前就呼叫 .bind(),又因为 javascript 是 call by sharing 所以此时传进 bind 的会是 undefined,即使后来 assignment 完成之后也不会影响传进 .bind() 里的 argument,所以实际上你等于呼叫了 .bind(undefined)
楼主: icydream (巧虎)   2019-04-13 14:44:00
感谢各位回答
作者: thethirdfoot (第三只脚)   2019-05-13 12:13:00
你可以加上严谨模式 跑出来的就会是undefinedbind执行的时候obj都还没初始化 所以会变undefined但是没有严谨模式他会自动导向Window

Links booklink

Contact Us: admin [ a t ] ucptt.com