JavaScript基礎

2024-03-07 18:36 更新

JSON

JSON相當于Java世界里的POJO(相當于JavaScirpt中由List和Map組成的POJO) 基本語法:

var d = { prop1:"value", prop2:true };

相當于

var d = new Object(); // 也可以寫作 var d = {};
d.prop1 = "value";
d.prop2 = true;

相對來說?var d= {};的寫法更為簡潔。Java程序員對上面的d.prop1="value"的實現(xiàn)不申明而直接使用的寫法會覺得比較奇怪,但是JS中確可以這樣使用,其實我們只要把JS中的Object想成Java的Map,d.prop1="value"就相當于d.put("prop1", "value");這樣就容易理解多了,事實上JS在客戶端的運行機制也和這個差不多,這樣我們就可以給任意屬性賦值。 我們再來看下面這個更為復雜的例子:

{
    name: "Phone",
    propertyDefs: [
        { name: "product", label: "型號", required: true },
        { name: "manufacturer", label: "生產(chǎn)商" },
        { name: "type", label: "機型", mapValues: [
            { key: "A", value: "直板" },
            { key: "B", value: "翻蓋" },
            { key: "C", value: "滑蓋" },
            { key: "D", value: "旋蓋" },
            { key: "Z", value: "其它" }
        ]
        },
        { name: "price", label: "價格", dataType: "float" }
    ]
}

上面的代碼給我們展示了一個多層的JSON對象,首先在頂層有兩個屬性,一個叫name,還有一個是propertyDefs。propertyDefs是一個數(shù)組,內(nèi)部又放了很多個子對象,例如:

{ name: "product", label: "型號", required: true },
{ name: "manufacturer", label: "生產(chǎn)商" },

根據(jù)前面的JSON的學習我們知道申明一個對象即可以用new Object,也可以直接用{}.上面就通過這種方式申明了多個對象,且每個子對象有不同的屬性。其中第三個子對象又包含了一個數(shù)組:

{ key: "A", value: "直板" },
{ key: "B", value: "翻蓋" },
{ key: "C", value: "滑蓋" },
{ key: "D", value: "旋蓋" },
{ key: "Z", value: "其它" }

上面的JSON的分析,我們可以看出這是一個挺復雜的JSON對象,是一個樹狀結(jié)構(gòu)的JSON,通過JSON我們可以很方便的創(chuàng)建一顆樹形結(jié)構(gòu)的對象。在AJAX越來越流行的今天,JSON更容易被開發(fā)人員所接受,也越來越多的在很多的開發(fā)框架中有所體現(xiàn),作為一個默認的標準技術(shù)而存在。我們看剛才這個復雜的JSON結(jié)構(gòu),它既是一段JavaScript,又是用來描述數(shù)據(jù)的很好的格式。它比XML更為簡潔,易讀。 更詳細的內(nèi)容: http://www.w3school.com.cn/json/index.asp http://www.ibm.com/developerworks/cn/web/wa-lo-json/

閉包

關(guān)于閉包的定義非?;逎y懂,因此我們通過下面的例子簡單的介紹閉包

function a() {
    var text = "Hello!"
    function b() {
        alert(text);
    }
    setTimeout(b, 500);
}

上述代碼定義了一個funciton a,但是a并不是我們要介紹的閉包,我們關(guān)注一下其內(nèi)部的定義,首先它申明了一個text的變量,之后又定義了一個function b,在function b中使用了這個變量,function b中自己沒有定義這個變量,而是直接使用了function外的text變量。但是在代碼結(jié)束的地方并沒有直接調(diào)用function b,而是采用了一個延時500毫秒再執(zhí)行function b的寫法,對于Java程序員可能會很奇怪text變量的使用,很容易得出如下的結(jié)論:“500毫秒的延時,function的調(diào)用應該已經(jīng)結(jié)束了,如果結(jié)束的話私有變量text變量就應該已經(jīng)被釋放,從而導致function b無法訪問到變量text”。你推測的沒錯,在Java的世界確實是這樣,但是在JavaScript的世界就允許你這樣使用。并且對這種用法中的function b在JavaScript中就被稱為閉包函數(shù)。在JS中閉包函數(shù)可以訪問所處環(huán)境中的局部變量。并且瀏覽器中的GC對于變量的回收處理也會有所差別,當它判斷到一個局部變量被某一個閉包函數(shù)所引用時,JS引擎就會阻止該變量被GC回收。直到這個變量沒有被引用。 閉包函數(shù)不一定需要命名,也可以是匿名函數(shù),如:

setTimeout(function(){
    alert(text);
}, 500);

更多文檔參考: http://developer.51cto.com/art/200907/139159.htm http://www.jb51.net/article/25737.htm http://www.csser.com/dev/42.html

回調(diào)函數(shù)

回調(diào)函數(shù)最常見于Ajax操作和延時操作(如前面的例子)。通常都是利用閉包完成的。也就是說回調(diào)函數(shù)就是閉包的一種使用場景。在Dorado開發(fā)中會有較多地方使用到回調(diào)函數(shù),如示例:

$ajax.request("data/phones.js", function(result) {
    grid.set("items", result.getJsonData());
});

上面的$ajax是Dorado中ajax調(diào)用的一個基本的工具類,我們調(diào)用其提供的request方法,方法找中的參數(shù)是一個URL。當這個URL請求結(jié)束后,$ajax工具類就會自動的觸發(fā)內(nèi)部的回調(diào)函數(shù),由于是異步的,因此內(nèi)部代碼的執(zhí)行是要等到ajax請求結(jié)束后才能進行。其中的grid等都是閉包機制中的局部變量,我們放心使用,不用擔心局部變量被釋放的問題。 如果是同步操作,代碼往往是如下形式的:

var result = $ajax.requestSync("data/phones.js");
grid.set("items", result.getJsonData());

看得出,同步代碼的格式更容易被程序員接受,代碼似乎也更為簡單。但是采用同步的運算方法和異步運算方法在瀏覽器中的執(zhí)行效果會有很大差別,例如一個耗時5秒的http請求,如果采用同步處理機制,在這5秒內(nèi)用戶是不能做任何事情的,整個瀏覽器會完全卡住,使用戶無法進行包括頁面上的按鈕單擊,查詢,表單輸入等動作,必須等到ajax請求結(jié)束后才能進行,而采用異步處理方式,瀏覽器就允許在ajax執(zhí)行的同時,還接受用戶在界面上做的各種操作。而在5秒之后,回調(diào)函數(shù)依然會被觸發(fā)進行正常的數(shù)據(jù)邏輯處理。AJAX技術(shù)本身強調(diào)就是要盡可能的采用異步技術(shù)。盡可能的確保界面的友好性,和更有效率的界面操作。 更多文檔參考: http://www.ityoudao.com/Web/Html_JS_646_1736.html http://www.iteye.com/topic/301453 http://luxiao1223.blog.51cto.com/2369118/482885 http://bbs.51js.com/thread-85825-1-1.html

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號