为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕神8447489 2019-03-07 14:15:23
以下属性绑定虽然是 多此一举,但为什么给属性重新绑定自身对象,反而成了window?var obj = {    con: function fn(x){            console.log(x);        // 10            console.log(this);     // window        }.bind(obj)}obj.con(10);   
查看完整描述

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)();


查看完整回答
反对 回复 2019-03-18
?
一只甜甜圈

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


查看完整回答
反对 回复 2019-03-18
  • 2 回答
  • 0 关注
  • 445 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信