继夫的玩弄H辣文的小说|女人与拘性猛交视频|精品欧美高清不卡高清|一起做亏亏的事情的视频|啦啦啦在线视频观看|望月直播下载ios版本|国产日韩欧美一区二区三区

JavaScript高級技巧

var foo = (function foo(){if(a != b){return function(){console.log('aaa')}}else{return function(){console.log('bbb')}}})();
這里創建一個匿名,自執行的函數,用來確定應該使用哪一個函數來實現 。
惰性函數的優點就是只在第一次執行分支時犧牲一點點性能
函數綁定
請使用fun.bind([, arg1[, arg2[, …]]])
當綁定函數被調用時 , 該參數會作為原函數運行時的 this 指向 。當使用new 操作符調用綁定函數時,該參數無效
arg1,arg2,…
當綁定函數被調用時,這些參數將置于實參之前傳遞給被綁定的方法
返回
由指定的this值和初始化參數改造的原函數拷貝
一個例子
let person = {name: 'addone',click: function(e){console.log(this.name)}}let btn = document.getElementById('btn');EventUtil.addHandle(btn, 'click', person.click);
這里創建了一個對象js 判斷節點是否存在,然后將.click方法分配給DOM按鈕的事件處理程序 , 當你點擊按按鈕時,會打印出,原因是執行時this指向了DOM按鈕而不是
解決方案: 將this強行指向
EventUtil.addHandle(btn, 'click', person.click.bind(person));
函數柯里化
函數柯里化是把接受多個參數的函數轉變成接受單一參數的函數
function add(num1, num2){return num1 + num2;}function curryAdd(num2){return add(1, num2);}add(2, 3) // 5curryAdd(2) // 3
【JavaScript高級技巧】這個例子用來方便理解柯里化的概念
下面是創建函數柯里化的通用方式
function curry(fn){var args = Array.prototype.slice.call(arguments, 1);return function(){let innerArgs = Array.prototype.slice.call(arguments);let finalArgs = args.concat(innerArgs);return fn.apply(null, finalArgs);}}
第一個參數是要進行柯里化的函數,其他參數是要傳入的值 。這里使用Array..slice.call(, 1)來獲取第一個參數后的所有參數(外部) 。在返回的函數中js 判斷節點是否存在,同樣調用Array..slice.call()讓來存放所有的參數(內部),然后用將內部外部參數組合,用apply傳遞給函數
function add(num1, num2){return num1 + num2;}let curryAdd1 = curry(add, 1);curryAdd1(2); // 3let curryAdd2 = curry(add, 1, 2);curryAdd2(); // 3
防篡改對象
中任何對象都可以被同一環境中運行的代碼修改 , 所以開發人員有時候需要定義防篡改對象(-proof ) 來保護自己
不可擴展對象
默認情況下所有對象都是可以擴展的(添加屬性和方法)
let person = { name: 'addone' };person.age = 20;
第二行為對象擴展了age屬性 , 當然你可以阻止這一行為,使用.()
let person = { name: 'addone' };Object.preventExtensions(person);person.age = 20;person.age // undefined
你還可以用.()來判斷對象是不是可擴展的
let person = { name: 'addone' };Object.isExtensible(person); // trueObject.preventExtensions(person);Object.isExtensible(person); // false
請記住這是不可擴展!!,即不能添加屬性或方法
密封的對象
密封對象不可擴展,且不能刪除屬性和方法
let person = { name: 'addone' };Object.seal(person);person.age = 20;delete person.name;person.age // undefinedperson.name // addone
相對的也有.()來判斷是否密封
let person = { name: 'addone' };Object.isExtensible(person); // trueObject.isSealed(person); // falseObject.seal(person);Object.isExtensible(person); // falseObject.isSealed(person); // true
凍結的對象
這是最嚴格的防篡改級別 , 凍結的對象即不可擴展,又密封,且不能修改
let person = { name: 'addone' };Object.freeze(person);person.age = 20;delete person.name;person.name = 'addtwo'person.age // undefinedperson.name // addone
同樣也有.來檢測
let person = { name: 'addone' };Object.isExtensible(person); // trueObject.isSealed(person); // falseObject.isFrozen(person); // falseObject.freeze(person);Object.isExtensible(person); // falseObject.isSealed(person); // trueObject.isFrozen(person); // true
以上三種方法在嚴格模式下進行錯誤操作均會導致拋出錯誤
高級定時器
閱讀前提
大概理解的基本執行機制和js事件機制
重復的定時器
當你使用重復定義多個定時器的時候,可能會出現某個定時器代碼在代碼再次被添加到執行隊列之前還沒有完成執行,導致定時器代碼連續執行多次 。
機智引擎解決了這個問題 , 使用()的時候,僅當沒有該定時器的其他代碼實例時,才會將定時器代碼添加到隊列中 。但這還會導致一些問題:
為了避免這個兩個問題,你可以使用鏈式()調用
setTimeout(function(){TODO();setTimeout(arguments.callee, interval);}, interval)
.獲取了當前執行函數的引用,然后為其設置另外一個定時器,這樣就確保在下一次定時器代碼執行前,必須等待指定的間隔 。
瀏覽器對長時間運行的腳本進行了制約,如果代碼運行超過特定的時間或者特定語句數量就不會繼續執行 。
如果你發現某個循環占用了大量的時間 , 那么對于下面這兩個問題
如果你的兩個答案都是”否”,那么你可以使用一種叫做數組分塊(array ) 的技術 。基本思路是為要處理的項目創建一個隊列,然后使用定時器取出下一個要出處理的項目進行處理,然后再設置另一個定時器 。
function chunk(array, process, context){setTimeout(function(){// 取出下一個項目進行處理let item = array.shift();process.call(item);if(array.length > 0){setTimeout(arguments.callee, 100);}}, 100)}
這里接受三個參數 , 要處理的數組,處理的函數,運行該函數的環境(可選) , 這里設置間隔100ms是個效果不錯的選擇
如果你一個函數需要50ms以上時間完成,那么最好看看能否將任務分割成一系列可以使用定時器的小任務
函數節流()
節流的目的是防止某些操作執行的太快 。比如在調整瀏覽器大小的時候會觸發事件,如果在其內部進行一些DOM操作,這種高頻率的更愛可能會使瀏覽器崩潰 。為了避免這種情況,可以采取函數節流的方式 。
function throttle(method, context){clearTimeout(method.tId);method.tId = setTimeout(function(){method.call(context);}, 100)}
這里接受兩個參數,要執行的函數,執行的環境 。執行時先清除之前的定時器,然后將當前定時器賦值給方法的tId,之后調用call來確定函數的執行環境 。
一個應用的例子
function resizeDiv(){let div = document.getElementById('div');div.style.height = div.offsetWidth + "px";}window.onresize = function(){throttle(resizeDiv);}
給個 , 轉發謝謝
Java創建對象方式
深入理解Java內存模型
Java線上% 問題排查
Java加密與解密之對稱加密DES
Java分布式事務實現
你不得不知道的七個小技巧
中使用Cache及的使用
jpa 實現讀寫分離
MVC 異步請求方式
本文到此結束,希望對大家有所幫助 。