2017-07-11 45 views
1

雖然learning javascript,但我遇到(製作)了一個根據屬性名稱具有不同行爲的示例。JavaScript「this」關鍵字根據屬性名稱的不同行爲

  • 在情況1中它打印未定義(這是可以理解的)
  • 在情況2中它打印要麼沒有(FF 54)或一些異常代碼(運行該腳本時看到的)

的問題

爲什麼在屬性名稱更改時會有不同的行爲?

<!DOCTYPE html> 
 
<html lang="en"> 
 

 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>tests</title> 
 
    <script> 
 
    "use strict"; 
 
    </script> 
 
</head> 
 

 
<body> 
 
    <ul> 
 
    <li>Case 1 <br> 
 
     <script> 
 
     let myAbstractObject2 = { 
 
      text1: "someText", 
 
      someMethod1() { 
 
      document.write(`[Output] text1 = ${this.text1}!<br>`); 
 
      } 
 
     }; 
 

 
     myAbstractObject2.someMethod1(); 
 

 
     (true ? myAbstractObject2.someMethod1 : null)(); 
 
     </script> 
 
    </li> 
 
    <li>Case 2 <br> 
 
     <script> 
 
     let myAbstractObject3 = { 
 
      name: "someText", 
 
      someMethod1() { 
 
      document.write(`[Output] name = ${this.name}!<br>`); 
 
      } 
 
     }; 
 

 
     myAbstractObject3.someMethod1(); 
 

 
     (true ? myAbstractObject3.someMethod1 : null)(); 
 
     </script> 
 
    </li> 
 
    </ul> 
 
</body> 
 

 
</html>

+0

它是否有可能從li對象獲取名稱屬性?如果使用say2或text2,你會得到相同的結果嗎? – Tommy

+2

@Tommy屬性取自'window',請參閱[window.name](// mdn.io/window.name) –

+0

@UlysseBN好酷,所以我有正確的想法只是錯誤的對象。 – Tommy

回答

4

在情況編號爲2,this.name將指window.name。這就是爲什麼你得到一個GUID。

它基本上與案例1(this歸結爲窗口全局屬性)相同,只不過您使用了一個關鍵字,它是窗口全局屬性的定義屬性。

+0

@naaz這個答案適合你的問題嗎? –

+1

在教程中,我還沒有充分理解答案。但它確實有道理。 – naaz

相關問題