-
mark查看全部
-
觀察者模式查看全部
-
函數是第一類對象,這是javascript中的一個重要的概念。意味著函數可以像對象一樣按照第一類管理被使用,所以在javaScript中的函數: ? 能“存儲”在變量中 ? 能作為函數的實參被傳遞 ? 能在函數中被創建 ? 能從函數中返回查看全部
-
著作權歸作者所有。 商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 作者:趙望野 鏈接:https://www.zhihu.com/question/20289071/answer/14745394 來源:知乎 call 和 apply 都是為了改變某個函數運行時的 context 即上下文而存在的,換句話說,就是為了改變函數體內部 this 的指向。因為 JavaScript 的函數存在「定義時上下文」和「運行時上下文」以及「上下文是可以改變的」這樣的概念。二者的作用完全一樣,只是接受參數的方式不太一樣。例如,有一個函數 func1 定義如下:var func1 = function(arg1, arg2) {};就可以通過 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 來調用。其中 this 是你想指定的上下文,他可以任何一個 JavaScript 對象(JavaScript 中一切皆對象),call 需要把參數按順序傳遞進去,而 apply 則是把參數放在數組里。查看全部
-
單一職責原則(SRP:Single responsibility principle)又稱單一功能原則查看全部
-
pushStack: 新建一個jQuery對象并將上一個對象的引用加到棧中查看全部
-
get與eq的區別 .eq() 減少匹配元素的集合,根據index索引值,精確指定索引對象。 .get() 通過檢索匹配jQuery對象得到對應的DOM元素。 同樣是返回元素,那么eq與get有什么區別呢? eq返回的是一個jQuery對象,get返回的是一個DOM對象。舉個例子: $( "li" ).get( 0 ).css("color", "red"); //錯誤 $( "li" ).eq( 0 ).css("color", "red"); //正確 get方法本質上是把jQuery對象轉換成DOM對象,但是css屬于jQuery構造器的,DOM是不存在這個方法的,如果需要用jQuery的方法,我們必須這樣寫: var li = $( "li" ).get( 0 ); $( li ).css("color", "red"); //用$包裝 取出DOM對象li,然后用$再次包裝,使之轉變成jQuery對象,才能調用css方法,這樣要分2步寫太麻煩了,所以jQuery給我們提供了一個便捷方法eq()。查看全部
-
addBack:調用它會在棧中回溯一個位置,然后把兩個位置上的元素集組合起來,并把這個新的、組合之后的元素集推入棧的上方。查看全部
-
end方法可以回溯到之間的Dom元素集合查看全部
-
jQuery的這種管道風格的DSL鏈式代碼,總的來說: ? 節約JS代碼; ? 所返回的都是同一個對象,可以提高代碼的效率。 通過簡單擴展原型方法并通過return this的形式來實現跨瀏覽器的鏈式調用。利用JS下的簡單工廠方法模式,來將所有對于同一個DOM對象的操作指定同一個實例。查看全部
-
要想理解為什么ready先執行,load后執行就要先了解下DOM文檔加載的步驟: (1) 解析HTML結構。 (2) 加載外部腳本和樣式表文件。 (3) 解析并執行腳本代碼。 (4) 構造HTML DOM模型。//ready (5) 加載圖片等外部文件。 (6) 頁面加載完畢。//load 從上面的描述中大家應該已經理解了吧,ready在第(4)步完成之后就執行了,但是load要在第(6)步完成之后才執行。 結論: ready與load的區別就在于資源文件的加載,ready構建了基本的DOM結構,所以對于代碼來說應該越快加載越好。在一個高速瀏覽的時代,沒人愿意等待答案。假如一個網站頁面加載超過4秒,不好意思,你1/4的用戶將面臨著流失,所以對于框架來說用戶體驗是至關重要的,我們應該越早處理DOM越好,我們不需要等到圖片資源都加載后才去處理框架的加載,圖片資源過多load事件就會遲遲不會觸發。查看全部
-
u查看全部
-
內存泄露兩點: ? JS的內存泄露,無怪乎就是從DOM中remove了元素,但是依然有變量或者對象引用了該DOM對象。然后內存中無法刪除。使得瀏覽器的內存占用居高不下。這種內存占用,隨著瀏覽器的刷新,會自動釋放。 ? 而另外一種情況,就是循環引用,一個DOM對象和JS對象之間互相引用,這樣造成的情況更嚴重一些,即使刷新,內存也不會減少。這就是嚴格意義上說的內存泄露了。查看全部
-
DOM文檔加載的步驟: (1) 解析HTML結構。 (2) 加載外部腳本和樣式表文件。 (3) 解析并執行腳本代碼。 (4) 構造HTML DOM模型。//ready (5) 加載圖片等外部文件。 (6) 頁面加載完畢。//load查看全部
-
般來說,javascript要實現異步的收集,就需要“等待”,比如defer.resolve(5)雖然觸發了,但是done的處理還沒添加,我們必須要等待done、then等方法先添加了后才能執行了resolve,那么常規的的用法就是在resolve內部用setTimeout 0,image.onerror行成一個異步的等待操作處理。 但是jQuery很巧妙的繞過了這個收集方式, defer.resolve(5)方法實際就是觸發了callback回到函數的fireWith方法,這樣可以接受一個上下文deferred與參數5 deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments); 之前 done | fail | progress方法都是通過jQuery.Callbacks("once memory") 或 jQuery.Callbacks("memory")生成的。 實際上在Callback源碼fire方法有一句 memory = options.memory && data;這樣就很巧妙的緩存當前參數5的值,提供給下一個使用,這個就是then,pipe鏈式數據的一個基礎了,此刻的操作,我們把memory保存了這個數據的值。 重點來了,下一個defer.done的操作也是走的add的處理,把done的回調函數加入到list隊列中的之后,接著就會觸發。 // With memory, if we're not firing then // we should call right away } else if (memory) { firingStart = start; fire(memory); } 因為memory在上一個resolve操作的時候,緩存了5了,所以memory的判斷顯示是為真的,所以立刻就觸發了fire(memory)的代碼了,所以就算觸發的循序與添加的循序不一致,也不會導致錯誤。 而且jquery很巧妙的避免了異步收集的問題,這樣處理更可靠了??梢娀卣{函數模塊就是為Deferred模塊量身定做的了。查看全部
舉報
0/150
提交
取消