寫這篇文章是因為我上面Ztree的文章引發的我對js的研究,不明白的可以先看看上面Ztree的返回資料那塊,因為是同一個小例子,上篇是所有的代碼,:
我聲明全域變數tree,在Success回呼函數裡把回調的資料賦值給變數,我當時想著根據編程習慣做法也都是這,但是問題出現了,我先簡單說下Console.info這個方法是在控制台列印資料,因為alert返回資料的時候如果是json一些資料的時候,你是alert不出來實際資料的,這個方法是試用Firefox的,IE是不行的好像,這個不討論這個,Firefox上裝的是Firebug外掛程式,列印的結果是,
列印的結果是沒有的,接著我按下面這種方法如 ,也就是我把列印放在回呼函數裡是可以列印出來資料的,
這時候我疑問的是為什麼回調過來的資料不能賦值給全域變數,緊接著我看了Jquery 的API,發現了同步的方法,也就是如:
async: false在ajax裡加上是可以的,當然除了這個方法之外還可以把$.fn.zTree.init($("#treeDemo"), setting, tree);這段代碼寫在回呼函數裡也是可以實現樹形菜單的,但是我還是糾結為什麼回調的資料部能賦值給變數,接下來我有做了另一個實驗,如:
我在回調裡面列印了下,又在外面列印了下,結果如:
先列印出來的是下面的,問題比較明了了,雖然我先寫的ajax但是還是先執行的下面的代碼,所以那個變數tree是列印不出來的,而在回調裡面的是後來賦值的所以能列印出來,總結下那就是按照我一開始的寫法非同步請求不能將傳回值傳給全域變數的,因為JS只管執行當前代碼,順序執行。發送請求了,那是請求響應的事,它不管這些,只管繼續執行在它面前的代碼,所以是得不到變數賦值的,要想傳給變數可以使用同步也就是async: false,但是同步是要同步請求將鎖住瀏覽器,使用者其它操作必須等待請求完成才可以執行。如果想要賦值給Ztree的樹形菜單資料的話,我最後還是選擇了在回呼函數裡進行初始化,想在深入瞭解的大家可以看下JS非同步原理,這裡我就不多討論了,大家可以看看Ztree那篇的代碼,好了,結束。
第一次比較正式的寫技術文章盡量寫的詳細些,之前一直學習研究東西也沒倒上寫。以後時間允許的話我會盡量把之前的總結給大家,比較技術是交流和共用的,希望大家都明白,不管事技術好的還是剛入門的都可以看懂,希望對需要的朋友一點協助。有什麼問題可以反饋給我,我會及時的給你們回覆。QQ571001325