2016-12-03 31 views
0

我注意到一些東西在玩耍時引發了一個快速問題。Javascript:全局上下文和函數上下文聲明

當在全局/窗口上下文中執行代碼時,將任何函數聲明作爲方法添加到窗口對象中。

但是,當我在另一個對象的上下文中,編寫一個函數聲明不會將該方法添加到我的對象方法。

function functionInGlobalCtx() { // This will be added as a function to the window object 
    // code... 
} 

var myObject = {}; 

myObject.myObjectFunction = function() { 

    var $this = this; // The context here is the 'myObject' object 

    function functionHopefullyInMyObjectCtx() { 
     // code... 
    } 
} 

myObject.myObjectFunction(); 

爲什麼函數聲明作爲窗口對象的一部分而不是對象的一部分存在?

這是簡單的'如何JavaScript的作品'(特殊規則適用於全球上下文嗎?)還是我錯過了什麼?

謝謝。

回答

1

全局聲明的所有函數都會附加到全局窗口對象。這就是JavaScript的工作原理。

JavaScript只有函數範圍。因此,在另一個函數中聲明的任何函數對於外部函數都是私有的

功能functionHopefullyInMyObjectCtx無法從外部訪問。

myObject.myObjectFunction = function() { 
    var $this = this; 
    function functionHopefullyInMyObjectCtx() { 
     // code... 
    } 
} 

在函數中聲明一個函數並不會將它自動附加到this。但是功能的私密性是唯一範圍內訪問它在聲明

如果你想從myObject.myObjectFunction那麼這裏訪問functionHopefullyInMyObjectCtx功能是一種方法:

var myObject = {}; 

myObject.myObjectFunction = function() { 
    return { 
     functionHopefullyInMyObjectCtx: function() { 
      console.log('I got called'); 
     } 
    } 
} 

obj = myObject.myObjectFunction(); 
//obj now has ref to the inner function 
obj.functionHopefullyInMyObjectCtx(); 

我被稱爲

這裏是一個很好看的:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

1

它實際上understanda BLE。功能是對象。 Myobject和myobjectfunction是兩個不同的對象。 「這個」也是自身的功能。

在您的示例中,您將在myobjfunction中定義希望的功能,而不是在myobject中定義。

0

我相信我找到了我正在尋找的答案。

爲什麼變量會自動分配給全局/窗口對象?

由於JavaScript引擎保留在全局範圍內聲明的項目的「全局環境記錄」(就像所有範圍都有一個包含所有聲明信息的環境記錄一樣),但是全局環境記錄和正常範圍之間的區別環境記錄是指引擎通過窗口對象在代碼中訪問此記錄(不僅僅是引擎內部使用)!

如果我錯了或者它不太合適,請繼續糾正我。

謝謝你的幫助。

https://es5.github.io/x10.html#x10.2.3

Difference between variable declaration syntaxes in Javascript (including global variables)?

相關問題