在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ 對(duì)象屬性綁定自己對(duì)象無(wú)效?

對(duì)象屬性綁定自己對(duì)象無(wú)效?

以下屬性綁定雖然是 多此一舉,但為什么給屬性重新綁定自身對(duì)象,反而成了window?

var obj = {
    con: function fn(x){
            console.log(x);        // 10
            console.log(this);     // window
        }.bind(obj)
}

obj.con(10);    
回答
編輯回答
玩控

因?yàn)槟憬壎ǖ木褪莡ndefined,
1 var有聲明的提升作用,換為let或者const直接報(bào)錯(cuò)
2 在es3環(huán)境下this = undefined => window
var obj = {

con: (function(){
return function fn(x){
        console.log(x);        
        console.log(this);     
    };
console.log(obj);  // undefined
})()

}
你的代碼和這個(gè)一樣的效果
var obj = {

con: function fn(x){
        console.log(x);        
        console.log(this);     
    }

}

obj.con = obj.con.bind(undefined); // 將undefined換為obj就ok

2017年5月4日 08:30
編輯回答
墨沫

這個(gè)問(wèn)題其實(shí)牽涉的比較多,先說(shuō) var 的問(wèn)題,題主的代碼相當(dāng)于:

1、代碼執(zhí)行前就會(huì)做var聲明提升,且初始值為 undefined,所以題主代碼相當(dāng)于:

var obj;
obj = {
    con: function fn(x){
            console.log(x);        // 10
            console.log(this);     // window
        }.bind(obj)
}

obj.con(10);  

2、賦值的執(zhí)行順序問(wèn)題:

A = B ; // 整個(gè)表達(dá)式返回 B

但是完整意義上是這樣的:

  1. 計(jì)算表達(dá)式A,得到一個(gè)引用refA;
  2. 計(jì)算表達(dá)式B,得到一個(gè)值valueB;
  3. 將valueB賦給refA指向的名稱(chēng)綁定;
  4. 返回valueB。

所以題主的代碼:

var obj;
obj = {
    con: function fn(x){
            console.log(x);        // 10
            console.log(this);     // window
        }.bind(obj)
}

obj.con(10);  

在進(jìn)行到 bind(obj)這里的時(shí)候,obj 還是 undefined,直到上述賦值完成,obj才指向那個(gè)對(duì)象,所以題主bind(obj)等價(jià)于 bind(undefined);

這個(gè)賦值的順序問(wèn)題,也解釋了,你用 let 的時(shí)候,報(bào)錯(cuò) obj is not defined 的原因;

3、在 thisArgu 的位置傳入了 undefined,this 通常會(huì)指向誰(shuí)呢?這個(gè)測(cè)試下就知道了,印象里瀏覽器端非嚴(yán)格模式大多是 window,嚴(yán)格模式大多是 undefined,測(cè)試代碼:

  (function() { 
    console.log(this) ;//window
  }).bind(undefined)();

  (function() { 
    'use strict'
    console.log(this) ;//undefined
  }).bind(undefined)();

2017年8月16日 01:02