2016-03-11 38 views
0

我已經分析一些javscript源代碼,發現一個對象被聲明略微不同的是正常的程序,然後在其program.Its使用throught如何聲明如下將屬性/方法添加到全局對象?

window.ext = {}; 

及其屬性在共同被添加這樣

ext.webRequest = { 
    Property1/function2 : Property 
    Property2/function2: function() 
    } 

我的疑惑是

  • 程序是正常的,省略WINDO w.ext.webrequest,只需致電ext.webrequest
  • 是否有任何隱藏的理由/優勢來宣佈這樣的對象?
+0

它的JavaScript和它就像那樣。它是一種基於'prototype'的語言,而不是一種更常見的'面向對象'或'過程'語言。 [this](http://c2.com/cgi/wiki?PrototypeBasedProgramming)和[this](https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Details_of_the_Object_Model) –

回答

1

全局變量存儲在全局對象中(這是如何根據ECMA腳本規範調用的)。

在大多數Web瀏覽器中,它們都調用全局對象window,可以在不指定名稱的情況下訪問它。

所以最終:

window.ext = {};ext = {};是等價的(當且僅當你叫他們同全球範圍內未在嵌套範圍內和(即功能或對象範圍))。

是否有任何隱藏的理由/優勢宣佈這樣的對象?

優點/原因是聲明這樣的對象使得它們可以在所有級別訪問,因爲它們將在全局範圍內聲明。

1

忽略window.ext.webrequest並簡單地調用 ext.webrequest是否正常?

沒有,有差異。

窗口是一個全局對象,也是一個主機對象。如果你不給一個窗口上下文(或全球)的財產像obj.ext.webrequest JS引擎將

  • 首先看看這個對象在本地範圍內,那麼它的父等等,直到一個全球範圍內的。上下文是在功能級而不是在塊級上定義的。

  • 如果上下文在本地可用,它將使用該值而不是window.ext.webrequest值。

有什麼隱情/優勢申報對象這樣呢?

一個優點我所觀察到的是,當你想從onclick屬性調用一個方法,像

<div onclick="method1()">Click here</div> 

這會自動尋找在全球範圍內這種方法。

但通常我們要等待DOM被加載(如在JS fiddle它是默認設置),在這種情況下,你的方法定義被包裹在裏面document.onload事件處理函數一樣

document.onload = function(){ 

    var method1 = function() 
    { 
    //some action here 
    } 
}; 

現在這個method1函數在全局上下文中不可見,所以onclick事件將無法找到此方法。

但是,如果你指定這個方法來全球範圍內像這樣

document.onload = function(){ 

    window.method1 = function() 
    { 
    //some action here 
    } 
}; 

現在,將可onclick事件。