2 回答
TA贡献1900条经验 获得超5个赞
这个问题其实牵涉的比较多,先说 var 的问题,题主的代码相当于:
1、代码执行前就会做var声明提升,且初始值为 undefined,所以题主代码相当于:
var obj;
obj = {
con: function fn(x){
console.log(x); // 10
console.log(this); // window
}.bind(obj)
}
obj.con(10);
2、赋值的执行顺序问题:
A = B ; // 整个表达式返回 B
但是完整意义上是这样的:
计算表达式A,得到一个引用refA;
计算表达式B,得到一个值valueB;
将valueB赋给refA指向的名称绑定;
返回valueB。
所以题主的代码:
var obj;
obj = {
con: function fn(x){
console.log(x); // 10
console.log(this); // window
}.bind(obj)
}
obj.con(10);
在进行到 bind(obj)这里的时候,obj 还是 undefined,直到上述赋值完成,obj才指向那个对象,所以题主bind(obj)等价于 bind(undefined);
这个赋值的顺序问题,也解释了,你用 let 的时候,报错 obj is not defined 的原因;
3、在 thisArgu 的位置传入了 undefined,this 通常会指向谁呢?这个测试下就知道了,印象里浏览器端非严格模式大多是 window,严格模式大多是 undefined,测试代码:
(function() {
console.log(this) ;//window
}).bind(undefined)();
(function() {
'use strict'
console.log(this) ;//undefined
}).bind(undefined)();
TA贡献1836条经验 获得超5个赞
因为你绑定的就是undefined,
1 var有声明的提升作用,换为let或者const直接报错
2 在es3环境下this = undefined => window
var obj = {
con: (function(){
return function fn(x){
console.log(x);
console.log(this);
};
console.log(obj); // undefined
})()
}
你的代码和这个一样的效果
var obj = {
con: function fn(x){
console.log(x);
console.log(this);
}
}
obj.con = obj.con.bind(undefined); // 将undefined换为obj就ok
添加回答
举报