2017-07-14 19 views
0

我想了解執行上下文,創建階段和執行階段。爲什麼當我做一個console.log是我的對象在一個函數內返回'undefined'? (瞭解創建階段,執行階段)

我不知道,可能有人請幫助我瞭解爲什麼,

console.log(thisFunction.ojbect1); 

返回 - '未定義'。

我會想到,在創建階段之後,當變量被賦予'未定義'時,運行執行階段,然後在變量中填充對象。

那麼,爲什麼我會得到「未定義」的'對象1',而不是整個對象?

非常感謝。下面的代碼。

var thisFunction = function(){ 
    var object1 = { 
     firstname: 'Mark', 
     printName: function(){ 
     console.log(this.firstname); 
     } 
    }; 

    object1.printName(); 
}; 

thisFunction(); 
console.log(thisFunction.object1); 
+0

這個例子'object1'是一個局部變量用於'thisFunction'所以不能隱thisFunction'的'範圍之外訪問。 –

回答

0

「Object1」不是「thisFunction」的屬性,這就是爲什麼你不能調用它。 「Object1」是在「thisFunction」範圍內創建的變量。

您只能訪問父範圍的變量。

如果您想了解更多關於功能範圍的信息,請參閱以下有趣的內容。

+0

謝謝!我想我的問題更多,爲什麼Object1分配變量'未定義'。即爲什麼它在創建階段被分配'未定義',然後從未在執行階段分配過對象? 我可能在這裏沒有任何意義:) –

+0

每次調用'thisFunction'時都會創建一個新的作用域。這個範圍有局部變量'object1'。因此它在'thisFunction'之外是未定義的。 當你鍵入'thisFunction.object1'時,你不會調用'thisFunction'。相反,您將'thisFunction'視爲一個對象並查找名爲'object1'的屬性。這不起作用,因爲'thisFunction'是一個函數。 –

+0

你提到:'thisFunction是一個函數',我認爲這是我感到困惑的地方。 JavaScript中不是函數也不是對象? –

0
  1. 您需要使用這個分配一個變量函數對象thisFunction
  2. 然後您需要使用創建這個函數的對象。

這工作,你除了:

var thisFunction = function(){ 

    this.object1 = { 
     firstname: 'Mark', 
     printName: function(){ 
     console.log(this.firstname); 
     } 
    }; 

    this.object1.printName(); 
}; 

var tf = new thisFunction(); 
console.log(tf.object1); 

使用typeof幫助您更好地瞭解對象和功能之間的區別:

console.log(typeof thisFunction); 
console.log(typeof tf); 
console.log(typeof tf.object1); 
console.log(typeof tf.object1.firstname); 

輸出:

功能
對象
對象

看看Plunker

+0

謝謝,爲此,仍然有一些學習要做,以充分理解您的解決方案下發生了什麼。 –

+0

感謝您的反饋!請點擊向上箭頭來提示我的答案。 –

相關問題