全球支配,第二部分

2008年4月16日在下午1時29分由Douglas Crockford |在發展 | 9評論

我繼續練習的工藝編程,我總是檢查我的做法。 我可以提高我的使用模式,這樣我可以讓我的程序更清晰,更強大,更好? 這是特別重要的工作時用的語言如JavaScript其中有一個偏見有利於模式的混亂,弱,差。

其中最嚴重的特點是它依賴 JavaScript的全局變量。 這可以緩解與全球減排模塊的模式 ,這樣可以大大減少數量的全局變量,我們需要聲明。

但是,當我們必須聲明一個全局變量,如何辦呢? JavaScript提供了三種方法聲明一個全局變量,它們都有問題。 這是最最差的?

首先是分配給一個新的名字以外的任何功能。

 可惜= {} / /第一種形式 

二是使用var關鍵字以外的任何功能。

  VAR可惜= {} / /第二種形式 

三是分配給屬性的全局對象。

  this.pity = {} / /第三種形式 

所有三種形式做同樣的事情。 (還有第四個方式,惡劣暗示全球性的,但我們不會說話的,在這裡,並且不要讓我開始在第五和第六的方法。)

因此,考慮三種方式做同樣的事情,我們應該使用它? 以前我贊成第二種方式。 它看起來對我最清楚的說明(或至少暗示)我打算申報的東西。

但它並不完全令人滿意。 首先,有些人看var在那個位置的聲明變量的範圍的編譯單元,類似的方式static作品在C這將是一個有益的閱讀,除了JavaScript沒有編譯單元的範圍。 一個有經驗的程序員應該知道,但以驚人的比例Web開發人員計劃在無知的語言,所以這是一個溫和的關注。

一個更令人關注的是,第二種形式是大於第一種形式,但做同樣的事情。 一般來說,我更喜歡最小的形式。

但是,事情終於說服了我的第一種形式是最糟糕的是,IE得到錯誤的第二種形式,使負責任自適應方案失敗時使用構造像

  VAR可惜= this.pity | | {}; 

為了能夠最大限度地生產,我想避免的功能,具有便攜性的問題。 我花了很長時間接受的是,第二種形式是有問題的,因此應避免。

我最喜歡對第二種形式是,它似乎更有意的。 通過輸入var ,我宣布,這不是一個偶然的拼寫錯誤。 我故意宣布一個新的全局變量。 但JavaScript放在眼裡。 我仍然覺得有必要指出的意圖,所以我在註釋狀態。

  / *全球可惜* /
    可惜= {}; 

JSLint是能夠理解的註釋,可以提醒我任何全局變量,我沒有故意申報。 這給了我信心,我不是一個常見的錯誤。 第二種形式讓我感覺很好,但實際上並沒有給我任何真正的保證。

我仍然在學習如何編程。 我讀的代碼,我認為意見的其他程序員。 我仍然有能力改變我的做法。 這是很難承認,有時我以前的做法是薄弱。 但是,這足以抵消採用的做法是強。

共享和擴展: 書籤與del.icio.us | Digg它! | 書籤交易!

9評論

  1. 測試評論系統,這是下一段時間存在。 一切似乎都恢復正常了,所以給它去!

    評論由管理員- 2008年4月21日

  2. 我認為這是常識檢查typeof pity === 'undefined' ,而不是使用構造像var pity = this.pity || {};尤其是假設代碼問題是一個合理的副產品自適應程序。

    如果您認為 Web開發人員計劃在無知觀眾說的語言和這個博客的讀者(或讀者的任何JavaScript博客作者誰採用此方法)是相互排斥的,那麼我們可能的趨勢,同意你的第三種形式是適當的。

    但是,看到大多數開發商的“學習”複製和粘貼,它似乎是第二種形式可能會更安全,如果沒有其他原因,而不是防止這些惡劣的全局大家都深惡痛絕。

    評論由扎克萊澤曼 - 2008年4月21日

  3. 在“VAR可惜= this.pity | | {}”和它的變種已成為近期頗為流行的JavaScript庫,和我喜歡我自己。 你必須給到假設你使用它的地方布爾值不是你的期望。

    其中最有用的情況我會作為默認值的功能參數。 考慮:

    函數 doSomething(一){
    A = A | |“默認值”;
    }

    如果變量“一”是不確定的在這裡,它會得到一個默認值,使之變“的”有用的,其餘的功能。

    但如果你願意,我想這可以寫成:

    函數 doSomething(一){
    A =(A!==未定義?答:“默認值”);
    }

    評論由Frode丹尼爾森 - 2008年5月1日

  4. [...]在撒謊,如果我說我是不是就這一個外部的影響。 道格拉斯克羅克福德有很多偉大的建議,這是一個我傾向於同意[...]

    Pingback由scriptNode /我的新的編碼習慣 - 2008年8月2日

  5. 我喜歡怎樣的ExtJS的庫處理這一點。 這些抽象的開發人員遠離問題提供了一個實用程序來創建“命名空間。” 我不知道它們究竟是如何在幕後做它,但我知道,Douglas Crockford的JavaScript的網站是一個沉重影響其發展,所以我也不會感到驚訝地發現,他們使用一種以上的形式呈現。 作為一名開發人員,不過,所有我需要做的是這樣的:
    Ext.namespace('可惜');
    或本較短的形式:
    Ext.ns('可惜');
    我什至可以聲明多個層次上的一行:
    Ext.ns('可惜','pity.util','pity.util.text');

    評論由伯尼馬戈利斯-十一月19,2008

  6. 另一種形式,我通常喜歡是:

    this.pity | |(this.pity = {});

    其原因是它避免了額外的“同值”的分配如果,全球已經存在的,我做同樣的函數傳遞的參數為:

    函數 doSomething(一){
    A | |(A =“默認值”);
    }

    良好的聲音傳播任何正確的... ...

    評論由迭戈首位 - 2010年1月29日

  7. 但是,事情終於說服了我的第一種形式是最糟糕的是,IE得到錯誤的第二種形式,使負責任自適應方案失敗

    我一直沒能找到任何信息,如何獲取 IE的第二種形式是錯誤的。

    就個人而言,我一直在使用:

    var fooObj;
    if (fooObj === undefined) {
    fooObj = {};
    }

    評論由周杰倫在俄勒岡州-七月12,2010

  8. 不要使用描述的方法在上面的文章,如果你知道什麼是對你有好處。 您的代碼將打破ES - 5嚴格模式。

    由於未申報的分配是這樣的誤導部分語言,ECMAScript的5 -最新版本的ECMAScript -指定,當他們出現在一個嚴格的模式,ReferenceError應該被拋出。 這使得更健壯的代碼以較少的機會意外的錯誤。 此外,由於嚴格的模式或多或少是未來發展方向的語言,它是有道理的,以避免未申報的轉讓,如果他們根本不存在。

    評論由扎克萊澤曼 - 2011年3月29日

  9. 我建議只用函數形式的嚴格模式的聲明。 扎克的意見僅適用於文件的形式。

    評論由道格拉斯克羅克福德 - 2011年3月29日

對不起,評論已關閉在這個時候。

主辦單位雅虎

版權所有© 2006-2011雅虎公司保留所有權利。 隱私政策 - 服務條款

本站由WordPress的關於雅虎 虛擬主機