W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
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: "生產商" },
{ 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ù)組,內部又放了很多個子對象,例如:
{ name: "product", label: "型號", required: true },
{ name: "manufacturer", label: "生產商" },
根據(jù)前面的JSON的學習我們知道申明一個對象即可以用new Object,也可以直接用{}.上面就通過這種方式申明了多個對象,且每個子對象有不同的屬性。其中第三個子對象又包含了一個數(shù)組:
{ key: "A", value: "直板" },
{ key: "B", value: "翻蓋" },
{ key: "C", value: "滑蓋" },
{ key: "D", value: "旋蓋" },
{ key: "Z", value: "其它" }
上面的JSON的分析,我們可以看出這是一個挺復雜的JSON對象,是一個樹狀結構的JSON,通過JSON我們可以很方便的創(chuàng)建一顆樹形結構的對象。在AJAX越來越流行的今天,JSON更容易被開發(fā)人員所接受,也越來越多的在很多的開發(fā)框架中有所體現(xiàn),作為一個默認的標準技術而存在。我們看剛才這個復雜的JSON結構,它既是一段JavaScript,又是用來描述數(shù)據(jù)的很好的格式。它比XML更為簡潔,易讀。 更詳細的內容: http://www.w3school.com.cn/json/index.asp http://www.ibm.com/developerworks/cn/web/wa-lo-json/
關于閉包的定義非?;逎y懂,因此我們通過下面的例子簡單的介紹閉包
function a() {
var text = "Hello!"
function b() {
alert(text);
}
setTimeout(b, 500);
}
上述代碼定義了一個funciton a,但是a并不是我們要介紹的閉包,我們關注一下其內部的定義,首先它申明了一個text的變量,之后又定義了一個function b,在function b中使用了這個變量,function b中自己沒有定義這個變量,而是直接使用了function外的text變量。但是在代碼結束的地方并沒有直接調用function b,而是采用了一個延時500毫秒再執(zhí)行function b的寫法,對于Java程序員可能會很奇怪text變量的使用,很容易得出如下的結論:“500毫秒的延時,function的調用應該已經結束了,如果結束的話私有變量text變量就應該已經被釋放,從而導致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
回調函數(shù)最常見于Ajax操作和延時操作(如前面的例子)。通常都是利用閉包完成的。也就是說回調函數(shù)就是閉包的一種使用場景。在Dorado開發(fā)中會有較多地方使用到回調函數(shù),如示例:
$ajax.request("data/phones.js", function(result) {
grid.set("items", result.getJsonData());
});
上面的$ajax是Dorado中ajax調用的一個基本的工具類,我們調用其提供的request方法,方法找中的參數(shù)是一個URL。當這個URL請求結束后,$ajax工具類就會自動的觸發(fā)內部的回調函數(shù),由于是異步的,因此內部代碼的執(zhí)行是要等到ajax請求結束后才能進行。其中的grid等都是閉包機制中的局部變量,我們放心使用,不用擔心局部變量被釋放的問題。 如果是同步操作,代碼往往是如下形式的:
var result = $ajax.requestSync("data/phones.js");
grid.set("items", result.getJsonData());
看得出,同步代碼的格式更容易被程序員接受,代碼似乎也更為簡單。但是采用同步的運算方法和異步運算方法在瀏覽器中的執(zhí)行效果會有很大差別,例如一個耗時5秒的http請求,如果采用同步處理機制,在這5秒內用戶是不能做任何事情的,整個瀏覽器會完全卡住,使用戶無法進行包括頁面上的按鈕單擊,查詢,表單輸入等動作,必須等到ajax請求結束后才能進行,而采用異步處理方式,瀏覽器就允許在ajax執(zhí)行的同時,還接受用戶在界面上做的各種操作。而在5秒之后,回調函數(shù)依然會被觸發(fā)進行正常的數(shù)據(jù)邏輯處理。AJAX技術本身強調就是要盡可能的采用異步技術。盡可能的確保界面的友好性,和更有效率的界面操作。 更多文檔參考: 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
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: