猿问

对象属性绑定自己对象无效?

以下属性绑定虽然是 多此一举,但为什么给属性重新绑定自身对象,反而成了window?

var obj = {

    con: function fn(x){

            console.log(x);        // 10

            console.log(this);     // window

        }.bind(obj)

}


obj.con(10);   


慕神8447489
浏览 446回答 2
2回答

梵蒂冈之花

这个问题其实牵涉的比较多,先说 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)();

一只甜甜圈

因为你绑定的就是undefined,1 var有声明的提升作用,换为let或者const直接报错2 在es3环境下this = undefined => windowvar 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
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答