2011-05-18 111 views
4

我正在維護具有以下編碼風格的ASP.NET MVC應用程序。視圖有:這是什麼javascript編碼風格?

<script type="text/javascript"> 

    $(document).ready(function() { 

     SAVECUSTOMERS.init(); 
    }); 
</script> 

有一個js文件中包含的是沿着這些線路有云:

var SAVECUSTOMERS = (function() { 

    init = function() { 

     $("#saveCust").bind("click", OnSave); 
     $("#cancel").bind("click", OnCancel); 

    }, 

    OnSave= function() { 

     //Save Logic; 

    }, 

    OnCancel = function() { 
       //Cancel logic; 

    } 

    return { init: init }; 

})(); 
  1. 這是一個最佳實踐JS代碼風格?意圖有非突兀的JS?
  2. 什麼是SAVECUSTOMERS?我知道在JavaScript中創建類有不同的方法(按此link),但此風格不屬於列出的任何類別
  3. 我在哪裏可以找到關於此類JS編碼的更多信息?
+0

一些[jquery](http://www.w3schools.com/jquery/default.asp)教程在這裏可能會有所幫助。 – Kyle 2011-05-18 14:35:03

回答

4

1)使用$(document).ready(或另一個庫中的類似函數)函數被認爲是JavaScript中的標準慣例。首先,它確保您的JavaScript在完成評估/構建DOM的頁面上執行。當確定DOM何時已準備就緒時,它還抽象出一些瀏覽器實現的不一致性。但我認爲你主要是指第二代碼塊。

你看到的是SAVECUSTOMERS被分配了自動執行匿名函數的結果。這樣做有幾個原因,最常見的是能夠控制匿名函數中函數和數據的作用域和「命名空間」。這是因爲JavaScript具有詞法範圍,而不是塊級範圍。

使用JavaScript中這些自調用函數的做法是很常見的

但是代碼本身有幾個問題。變量init,OnSave和OnCancel被聲明爲全局變量(因爲var關鍵字被省略)。這在很大程度上破壞了將它們包裝在自我調用功能中的目的。此外,該函數的內容使用對象分配語法和標準表達式語法的混合,這將導致語法錯誤。

此外,通過僅返回init函數,onSave和onCancel函數通過使用閉包有效地「隱藏」或「私有」。這有助於保持命名空間的清潔和封裝。

如果我寫這個代碼(在這裏一些個人perferences,有有所建樹simliar幾個方法),那麼就應該是這樣的:

var SaveCustomers = (function($) { 
    var init = function() { 
     $("#saveCust").bind("click", onSave); 
     $("#cancel").bind("click", onCancel); 
    }; 

    var onSave = function() { 
     //Save Logic; 
    }; 

    var onCancel = function() { 
     //Cancel logic; 
    } 

    return { init: init }; 

})(jQuery); 

的一些注意事項以上:

  • 我使用var關鍵字聲明變量。這使它們的作用域保持本地化(你也可以在技術上使用命名函數聲明)

  • 我將jQuery作爲自調用函數中的參數傳遞,並將它作爲函數調用中的參數賦值給$ 。這將保護函數中的$變量,以便我們知道它引用了jQuery,並且沒有被同樣使用$的輔助庫消滅。

2)SAVECUSTOMERS是一個基本的JavaScript對象,它具有一個單一的擁有的財產稱爲「初始化」,它的值是一個函數,由所述執行內部初始化聲明所定義的。

3)不知道如何回答這個問題 - 對於理解JavaScript的最佳做法,最好的辦法是通過其他的JavaScript代碼,知道是優質的,比如jQuery的來源,或原型,或者閱讀下劃線等

+1

at 2),它實際上也有OnSave和OnCancel。 – Felix 2011-05-18 14:37:59

+0

@Felix生成的對象不直接包含OnSave和OnCancel,它們只能通過執行click事件處理程序來實現。實際上,對象的內容僅限於init – Matt 2011-05-18 14:40:17

+0

的值啊,沒有看到那裏的回報。對於那個很抱歉。 – Felix 2011-05-19 07:44:49

2

這種風格被稱爲jQuery的...你檢查的JQuery網站,通過它去......

1

它使用JQuery library

JQuery包含一個名爲$()的函數,它允許您使用CSS類語法從DOM中選擇元素。

$(document).ready位是一種標準的JQuery方法,用於確保所附代碼只在頁面加載完成後運行。這是確保事件正確連接到相關DOM對象所必需的。

函數被用作其他函數的參數的位被稱爲'閉包'它是編寫Javascript的一種非常常見的方式,但特別是當使用JQuery時,它使事情變得容易以及這種編碼風格的最小代碼。

請參閱本頁面:http://blog.morrisjohns.com/javascript_closures_for_dummies初學者討論如何在Javascript中使用閉包以及如何編寫它們(請注意,該頁面根本沒有看JQuery;閉包是JavaScript特性,它被JQuery嚴重使用,但您不需要JQuery來編寫閉包)

0

這是使用jQuery處理事件的常用方法。

會發生什麼basicly是您檢查文檔是否因此加載

$(document).ready(function() { 

     SAVECUSTOMERS.init(); 
    }); 

當它是你開始你的綁定添加到按鈕或什麼都搞不好會。

0

SAVECUSOMTERS中代碼的意圖是模仿對象中的私有和公共屬性。由於JS默認不支持這些,所以這個自調用函數執行並返回一定數量的屬性。在這種情況下,它返回'init'方法。儘管您看到OnSave和OnClick,但您會發現根本無法訪問它們。它們是「私人」的,只能在該功能內部使用。

$()函數是一個名爲jQuery的JavaScript庫的一部分http://jquery.com它是一個非常好的庫,主要用於DOM操作。

$(document)。ready()函數是jQuery不斷輪詢頁面直到它被加載的一種方式。如果是,則執行內部的JavaScript。

0
  1. 目標是具有公共和私人功能。 OnSaveOnCancel是私有函數,只能在自執行的匿名函數(function() { ... }())的範圍內進行訪問,該函數返回一個可公開訪問init函數的對象。

  2. SAVECUSTOMERS成爲由上述函數返回的對象,即{ init: init },該對象具有訪問該閉包內的函數的一個方法init

  3. 您可以閱讀道格拉斯Crockford的的Javascript:好的部分或斯托揚斯特凡的的Javascript模式

其他說明:

  • $()功能屬於jQuery庫
  • 有語法錯誤,因爲函數應該由;而不是,分開,因爲它們在函數內而不是對象內。