最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript 是你的高階函數(shù)(高級應用)

 更新時間:2015年06月15日 17:35:40   投稿:mdxy-dxy  
這篇文章主要介紹了Javascript 是你的高階函數(shù) ,需要的朋友可以參考下

在通常的編程語言中,函數(shù)的參數(shù)只能是基本類型或者對象引用,返回值也只是基本數(shù)據(jù)類型或?qū)ο笠?。但在Javascript中函數(shù)作為一等公民,既可以當做參數(shù)傳遞,也可以被當做返回值返回。所謂高階函數(shù)就是可以把函數(shù)作為參數(shù),或者是將函數(shù)作為返回值的函數(shù)。這兩種情形在實際開發(fā)中有很多應用場景,本文是我在工作學習中遇到的幾種應用場景的總結(jié)。

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

  代碼復用是衡量一個應用程序的重要標準之一。通過將變化的業(yè)務邏輯抽離封裝在回調(diào)函數(shù)中能夠有效的提高代碼復用率。比如ES5中為數(shù)組增加的forEach方法,遍歷數(shù)組,對每個元素調(diào)用同一個函數(shù)。

array = {};
array.forEach = function(arr, fn){
  for (var i = 0, len = arr.length; i < len; i++) {
    fn(arr[i], i, arr);
  }
}

通過回調(diào)函數(shù)將業(yè)務的重點聚焦在回調(diào)函數(shù)中,而不必每次都要重復編寫遍歷代碼。

  偏函數(shù)

  作為將函數(shù)當做返回值輸出的典型應用就是偏函數(shù)。所謂偏函數(shù)是指創(chuàng)建一個調(diào)用另外一個部分——參數(shù)或變量已經(jīng)預置的函數(shù)——的函數(shù)的用法。反正看著定義我是沒理解這東東干嘛的。咱們還是先看例子吧,偏函數(shù)最典型的例子就是類型判斷。

  Javascript對象都擁有三個屬性:原型屬性、類屬性、可擴展性。(不知道的同學要回去翻犀牛書哦,page:138)類屬性是一個字符串,Javascript中并未直接提供,但我們可以利用Object.prototype.toString來間接得到。該函數(shù)總是返回如下形式:

[object Class]  

因此我們可以編寫一系列isType函數(shù)。

代碼如下:

 

isString = function(obj){
  return Object.prototype.toString.call(obj) === "[object String]";
}
isNumber = function(obj){
  return Object.prototype.toString.call(obj) === "[object Number]";
}
isArray = function(obj){
  return Object.prototype.toString.call(obj) === "[object Array]";
}

 這幾個函數(shù)中大部分代碼是重復的,這時高階函數(shù)便華麗麗的登場了:

isType = function(type) {
  return function(obj) {
    return Object.prototype.toString.call(obj) === "[object " + type + "]";
  }
}

isString = isType('String');
isNumber = isType('Number');
isArray = isType('Array');

 所以通過指定部分參數(shù)來返回一個新的定制函數(shù)的形式就是偏函數(shù)。

  currying(柯里化)

  currying又稱部分求值。一個currying的函數(shù)首先會接受一些參數(shù),接受這些參數(shù)之后,函數(shù)并不會立即求值,而是繼續(xù)返回另一個函數(shù),剛才傳入的參數(shù)在函數(shù)形成的閉包中被保存起來。待到函數(shù)被真正需要求值的時候,之前傳入的所有參數(shù)都會被一次性用于求值。

var currying = function(fn) {
  var args = [];
  
  return function() {
    if (arguments.length === 0) {
      return fn.applay(this, args);
    } else {
      args = args.concat(arguments);
      return arguments.callee;
    }
  }
}

假設(shè)我們以計算一個月每天花銷為例:

var currying = function(fn) {
debugger;
  var args = [];
  
  return function() {
    if (arguments.length === 0) {
      return fn.apply(this, args);
    } else {
      Array.prototype.push.apply(args, arguments);
      return arguments.callee;
    }
  }
}

cost = function(){
  var sum = 0;
  for (var i = 0, len = arguments.length; i < len; i++) {
    sum += arguments[i];
  }
  
  return sum;
}
var cost = currying(cost);

cost(100);
cost(200);
alert(cost())

事件節(jié)流

  在某些場景下,某些事件可能會被重復的觸發(fā),但事件處理函數(shù)并不需要每次都執(zhí)行。比如在window.resize事件中進行復雜的邏輯計算,如果用戶頻繁的改變?yōu)g覽器大小,復雜計算會對性能造成嚴重影響;有時這些邏輯計算并不需要每次rezise時都觸發(fā),只需要計算有限的幾次便可以。這時我們需要根據(jù)時間段來忽略一些事件請求。請看以下節(jié)流函數(shù):

function throttle(fn, interval) {
   var doing = false;

   return function() {
    if (doing) {
     return;
    }
    doing = true;
    fn.apply(this, arguments);
    setTimeout(function() {
     doing = false;
    }, interval);
   }
  }
  
  window.onresize = throttle(function(){
    console.log('execute');
  }, 500);

通過控制函數(shù)執(zhí)行時間,可以在函數(shù)執(zhí)行次數(shù)與功能需求之間達到完美平衡。另一個事件是mousemove。如果我們給一個dom元素綁定該事件,鼠標在改元素上移動時,該事件便會重復觸發(fā)。

  事件結(jié)束

  對于某些可以頻繁觸發(fā)的事件,有時候我們希望在事件結(jié)束后進行一系列操作。這時我們可以利用高階函數(shù)做如下處理:

 

function debounce(fn, interval) {
  var timer = null;

 function delay() {
  var target = this;
  var args = arguments;
  return setTimeout(function(){
   fn.apply(target, args);
  }, interval);
 }

 return function() {
  if (timer) {
   clearTimeout(timer);
  }

  timer = delay.apply(this, arguments);
 }
};
window.onresize = throttle(function(){
  console.log('resize end');
}, 500);

如果在這一過程中事件被觸發(fā)則清除上一次事件句柄,重新綁定執(zhí)行時間。

參考資料:

《深入淺出node》

《Javascript設(shè)計模式與開發(fā)實踐》

相關(guān)文章

  • 基于javascript的無縫滾動動畫1

    基于javascript的無縫滾動動畫1

    這篇文章主要介紹了基于javascript的無縫滾動動畫實現(xiàn),文章通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Javascript延遲執(zhí)行實現(xiàn)方法(setTimeout)

    Javascript延遲執(zhí)行實現(xiàn)方法(setTimeout)

    延遲執(zhí)行,其實就是用到了setTimeout這個函數(shù)。善于利用這個函數(shù),可以減少很多ajax的請求,以及dom操作。
    2010-12-12
  • 寫js時遇到的一些小問題

    寫js時遇到的一些小問題

    寫js時遇到的一些小問題,需要的朋友可以參考下。
    2010-12-12
  • js截取函數(shù)(indexOf,join等)

    js截取函數(shù)(indexOf,join等)

    下面是js中截取字符串經(jīng)常會用到的一些函數(shù),這里每個函數(shù)都給出了例子,學習的朋友可以參考下。
    2010-09-09
  • 全面總結(jié)Javascript對數(shù)組對象的各種操作

    全面總結(jié)Javascript對數(shù)組對象的各種操作

    最近有個同事問了個問題,關(guān)于數(shù)組,對象和類數(shù)組的,仔細說起來都是基礎(chǔ),其實都沒什么好講的,不過看到還是有很多朋友有些迷糊,決定還是寫出來吧,下面這篇文章主要給大家介紹了Javascript對數(shù)組對象的各種操作,需要的朋友可以參考借鑒。
    2017-01-01
  • JavaScript 用cloneNode方法克隆節(jié)點的代碼

    JavaScript 用cloneNode方法克隆節(jié)點的代碼

    很多時候我們需要通過HTML DOM 的方式,用JavaScript 動態(tài)生成很多相同的節(jié)點,包括其子節(jié)點
    2012-10-10
  • 詳解如何在 JavaScript 中使用三元運算符

    詳解如何在 JavaScript 中使用三元運算符

    這篇文章主要為大家介紹了詳解如何在 JavaScript 中使用三元運算符示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 微信小程序?qū)崿F(xiàn)拖動懸浮圖標效果

    微信小程序?qū)崿F(xiàn)拖動懸浮圖標效果

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)拖動懸浮圖標效果,小程序上是實現(xiàn)拖動圖標,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • 詳解js跨域原理以及2種解決方案

    詳解js跨域原理以及2種解決方案

    這篇文章主要介紹了js跨域原理以及解決方案,跨域問題是由于javascript語言安全限制中的同源策略造成的,想要進一步了解跨域的朋友可以參考本文進行學習
    2015-12-12
  • js獲取form表單所有數(shù)據(jù)的簡單方法

    js獲取form表單所有數(shù)據(jù)的簡單方法

    下面小編就為大家?guī)硪黄猨s獲取form表單所有數(shù)據(jù)的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08

最新評論

洛南县| 长沙县| 海南省| 体育| 宜兰县| 铜梁县| 师宗县| 油尖旺区| 阿坝县| 海兴县| 北川| 永康市| 嘉兴市| 奎屯市| 温泉县| 孝感市| 芦溪县| 东至县| 汝南县| 阿鲁科尔沁旗| 九龙县| 蓬安县| 突泉县| 元阳县| 安新县| 靖边县| 离岛区| 梅州市| 深泽县| 大冶市| 枣阳市| 阿瓦提县| 扬中市| 思茅市| 上杭县| 博白县| 康乐县| 黄大仙区| 怀安县| 兴和县| 陵川县|