鍍金池/ 問答/HTML/ JavaScript中this指針的變化?

JavaScript中this指針的變化?

為什么第一次this指向的全局,第二次指向了obj,調(diào)用不是一樣的嗎,還是第一次賦值的時(shí)候作用域鏈有所變化?希望大神能給指點(diǎn)一下,謝謝了!

var name = 'ddd';
var obj = {
   name: "zcl",
   getName: function(){
       return this.name;
   }
}

console.log((obj.getName = obj.getName)());
console.log(obj.getName());

result1:ddd
result2:zcl

回答
編輯回答
編輯回答
情未了

this和函數(shù)調(diào)用的方式有關(guān),第一個obj.getName其實(shí)就是function(){ return this.name; },你把這個函數(shù)賦給obj.getName然后執(zhí)行其實(shí)就是匿名函數(shù)直接執(zhí)行,this指向window,也就是ddd,第二個是對象方式調(diào)用當(dāng)然this就指向obj

2018年8月10日 00:57
編輯回答
乞許

作用域鏈一旦確定是不會改的,你主要是對賦值表達(dá)式理解錯誤了,比如a = b,這只是一個賦值語句,把b中引用的值賦給了a,操作完之后就結(jié)束了,之后跟a是什么沒有關(guān)系。主要是賦值表達(dá)式有副作用,它返回了b引用的值。比方說b的值是1,那么a = b它的返回結(jié)果就是1。

//上文中
obj.getName = obj.getName      //有個返回值 function(){
                               //             return this.name;
                               //         }
//因此
(obj.getName = obj.getName)()   //相當(dāng)與如下

(function(){
      return this.name;
})()
//顯而易見this指向的是window,所以輸出的是ddd
2018年5月3日 15:56
編輯回答
葬憶

首先,this是運(yùn)行時(shí)的概念。在這里,getName()函數(shù)被包含在一個對象中,所以采用隱式綁定,隱士綁定this指向該對象。但當(dāng)此函數(shù)被賦值時(shí),它將失去隱式綁定,采用默認(rèn)綁定,而默認(rèn)綁定的情況下,this是指向調(diào)用棧中前一個調(diào)用函數(shù)的,在這里是window。

2017年10月29日 12:12
編輯回答
青檸
obj.getName = obj.getName

這是一個賦值表達(dá)式,關(guān)鍵它會返回一個值
舉例:
clipboard.png

所以(obj.getName = obj.getName)()等同于(function(){return this.name;})()
至于this的調(diào)用就不多說了,有很多資料可以查看,最簡單的辦法this始終指向調(diào)用者(this的指向是在執(zhí)行時(shí)而非定義時(shí)確定)

2017年4月23日 18:07