2016-12-31 28 views
0

雖然會通過JavaScript基礎知識,我得知this永遠是這是週期操作前的對象,但爲什麼,在掛接到對象的功能默認情況下是不是本身

  var ob = { 
       x:"", 
       setx: function(){ 
       x = "got u" 
       // in this function this is nothing but ob 
       } 

      } 
     ob.setx(); 
     console.log(ob.x); // this is giving me still "" 
     console.log(x); // getting here as 'got u' 

this在setx中應該有對象ob的上下文,但爲什麼它訪問全局空間而不是訪問它自己的x

如果我使用setx如下圖所示它的工作原理

   setx : function(){ 
       this.x = "got u" 
       } 

爲什麼我們要使用this關鍵字,即使「的getX」上下文綁定到ob對象

我錯過任何基本?

是否有任何設計模式,我們可以在子功能之間共享數據(應該是私有的)?這樣我們就可以隨時重複使用子功能。

+0

更多關於它setx'你_not_改變屬於該對象的'x'卻唯獨沒有與對象相關的變量。相反,'this.x'指的是屬於對象的'x'。 – vlaz

+0

,因爲JS無法讀懂你的思想/注意,如果你不告訴JS你想改變這個對象的x屬性,那麼x = ...意味着你想要賦值給一個**變量**'x',如果它找不到在scope-stack上聲明的這個變量,它會在全局範圍上創建它。這完全是默認行爲。這是由JS工作的規則。 – Thomas

+0

'是否有任何設計模式可以在兒童功能之間共享數據(應該是父級私有的)?這樣我們就可以重用孩子的功能,因爲我們去'是的,它被稱爲[閉包](// stackoverflow.com/questions/tagged/closures+javascript) – Thomas

回答

1

上下文和this是兩個單獨的事情。

在JS中,你有上下文作用域的功能(從ES6開始)你也有塊範圍)。這意味着如果變量的名稱已用var,let或const實例化,則同一變量名稱可以在不同範圍內具有不同的值。

this是存儲變量和函數的對象引用。 它與範圍不同的概念。你必須用this.作爲前綴來存放它在這個「包」中或者用它來使用它。

var x = 0; //variable scoped 
this.x = 1; //variable on object 

什麼this是取決於呼叫站點 - 如何調用函數。

從函數調用的呼叫站點確定它的優先順序爲 。按照這個順序提出這些問題,並在第一個 規則適用時停止。

是用new(new binding)調用的函數嗎?如果是這樣,這是新構建的對象。

VAR欄=新富()

被稱爲具有呼叫或功能應用(顯式綁定),甚至 隱藏綁定硬約束力裏面?如果是這樣,這是明確的 指定的對象。

變種巴= foo.call(OBJ2)

是帶一個上下文(隱式綁定)的功能,否則 稱爲擁有或含有對象?如果是這樣,這是上下文 對象。

變種條= obj1.foo()

否則,默認情況下,該(缺省綁定)。如果處於嚴格模式,請選擇 未定義,否則選擇全局對象。

var bar = foo()

就是這樣。這就是理解正常函數調用的綁定 的規則所需要的全部。呃......差不多。

你可以在'讀的書You Don't Know JS

相關問題