亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JS中使用apply方法通過不同數量的參數調用函數的方法

2019-11-20 09:50:35
字體:
來源:轉載
供稿:網友

apply()方法定義

函數的apply()方法和call方法作用相同,區別在于接收的參數的方式不同。
apply()方法接收兩個參數,一個是對象,一個是參數數組。

apply()作用

1、用于延長函數的作用域

示例:

var color='red';var o={color:'blue'};function sayColor(){console.log(this.color);}sayColor();//"red"sayColor.apply(o);//"blue" 

這里通過apply()方法把函數動態綁定到了對象o上了,這時this指向o對象,得到結果"blue"。

2、對象不需要與方法有任何耦合關系

下面舉個耦合的例子,看如何通過apply來解決這種耦合。

var color='red';var o={color:'blue'};function sayColor(){console.log(this.color);}o.sayColor=sayColor;o.sayColor();//"blue" 

這里先將函數放到了對象o中,這里對象和方法就緊耦合到一起了,方法的調用必須通過對象o。

沒有使用apply()和call()方法那樣靈活。
重構上面代碼,得到前例中的代碼。

var color='red';var o={color:'blue'};function sayColor(){console.log(this.color);}sayColor();//"red"sayColor.apply(o);//"blue" 

這里對象并沒有綁定任何方法,只是在需要使用的時候,利用函數的apply或call方法來動態綁定。

對象和方法之間沒有耦合在一起。這里還可以通過ES5提供的bind()方法來完成

3、實現可變參數函數傳參

下面一個計算任意數量數字平均值的函數

average(,,);average();average(,,,,,,,,);average(,,,,,,,,,); 

average函數是一個稱為可變參數或可變元函數(函數的元數是指其期望的參數個數)的例子。

當然這個函數也可以寫成一個接收數組的形式。

averageOfArray([,,]);averageOfArray([]);averageOfArray([,,,,,,,,]);averageOfArray([,,,,,,,,,]); 

使用可變參數的函數更簡潔、優雅??勺儏岛瘮稻哂斜憬莸恼Z法,至少讓調用者預先明確地知道提供了多少個參數。

如果我有這樣一個數組

var scores=getAllScores(); 

如何使用average函數計算平均值呢?

1.可變參數函數版本。

這時就可以和apply()方法配合使用,這里因為函數并沒用引用this變量,因此第一個參數我們傳入一個null。代碼如下:

var scores=getAllScores();average.apply(null,scores); 

2.直接參數為數組的形式

這里可以直接傳入數組參數。

var scores=getAllScores();averageOfArray(scores); 

以上兩種形式,個人覺得都是可以,反而第二種更簡單。多知道一種方法,對于遇到別人寫的函數時,可以輕松應對,不需要重構代碼。這個好處反而更多。

4、實現可變參數方法的傳值

示例:buffer對象包含一個可變參數的append方法,該方法添加元素到函數內部的state數組中。

var buffer={state:[],append:function(){for(var i=,n=arguments.length;i<n;i++){this.state.push(arguments[i]);}}}; 

這時append方法可以接受任意多個參數。

buffer.append('Hello,');buffer.append('firtName',' ','lastName','!');buffer.append('newLine'); 

形式如

buffer.append(arg1,arg2,arg3,...) 

借助apply方法的this參數,我們可以指定一個可計算的數組調用append方法

buffer.append.apply(buffer,getInputStrings()); 

注意:這里的buffer很重要,如果傳遞不同的對象,則append方法將嘗試修改該錯誤對象的state屬性。

提示

•使用apply方法指定一個可計算的參數數組來調用可變參數的函數
•使用apply方法的第一個參數給可變參數的方法提供一個接收者

附錄一

average函數

function average(){var args=[].slice.call(arguments);var sum=args.reduce(function(prev,cur){return prev+cur;});return parseInt(sum/args.length,);} 

averageOfArray函數

function averageOfArray(arr){ var sum=arr.reduce(function(prev,cur){return prev+cur;});return parseInt(sum/arr.length,);} 

ES5 bind()方法

這個方法創建一個函數的實例,其this值會被綁定到傳給bind()函數的值。
例如

var color='red';var o={color:'blue'};function sayColor(){console.log(this.color);}var oSayColor=sayColor.bind(o);oSayColor();//"blue" 

兼容低版本,參考使用下面的版本 :

if (!Function.prototype.bind) {Function.prototype.bind = function(oThis) {if (typeof this !== 'function') {// closest thing possible to the ECMAScript // internal IsCallable functionthrow new TypeError('Function.prototype.bind - what is trying to be bound is not callable');}var aArgs = [].slice.call(arguments, ),fToBind = this,fNOP = function() {},fBound = function() {return fToBind.apply(this instanceof fNOP? this: oThis,aArgs.concat(Array.prototype.slice.call(arguments)));};if (this.prototype) {// Function.prototype doesn't have a prototype propertyfNOP.prototype = this.prototype; }fBound.prototype = new fNOP();return fBound;};} 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
免费99精品国产自在在线| 亚洲一区美女视频在线观看免费| 国产精品免费小视频| 不用播放器成人网| 亚洲欧美日韩国产中文专区| 色悠悠国产精品| 伊人久久精品视频| 国产精品美女免费视频| 午夜精品久久久久久久久久久久| 欧美伦理91i| 精品国产91久久久久久| 中文字幕亚洲图片| 欧美日韩中国免费专区在线看| 亚洲国产一区自拍| 日韩精品一区二区三区第95| 国产一区二区黑人欧美xxxx| 国产偷亚洲偷欧美偷精品| 日韩精品在线看| 色偷偷88888欧美精品久久久| 久久精品99久久久香蕉| 国产免费一区二区三区在线观看| 欧美精品videos另类日本| 久久精品国产清自在天天线| 久久精品国产成人精品| 亚洲偷熟乱区亚洲香蕉av| 国产精品高潮呻吟久久av野狼| 日韩网站免费观看高清| 欧美激情国产日韩精品一区18| 伊人伊成久久人综合网站| 国产91色在线播放| 亚洲国产精品成人一区二区| 亚洲第一精品电影| 欧美精品18videos性欧美| 日韩在线视频网站| 福利一区福利二区微拍刺激| 国产精品视频最多的网站| 97精品免费视频| 国产精品一区久久| 日本精品久久久久影院| 亚洲第一中文字幕在线观看| 亚洲精品国产精品国自产在线| 中国日韩欧美久久久久久久久| 欧美日韩午夜视频在线观看| 亚洲成年人在线播放| 国产有码在线一区二区视频| 精品动漫一区二区三区| 国产欧美一区二区三区四区| 日本精品视频在线观看| 97在线观看免费高清| 狠狠躁天天躁日日躁欧美| 欧美大片网站在线观看| 国产精品女人久久久久久| 欧美亚洲另类激情另类| 亚洲免费视频网站| 亚洲缚视频在线观看| 欧洲日本亚洲国产区| 日韩美女免费观看| 久久精品国产电影| 亚洲新声在线观看| 亚洲wwwav| 97视频免费在线观看| 91伊人影院在线播放| 精品国产一区二区在线| 久久久久久伊人| 最近中文字幕2019免费| 中文字幕在线观看日韩| 日韩欧美国产成人| 国产精品网站视频| 全亚洲最色的网站在线观看| 亚洲午夜女主播在线直播| 欧美精品久久一区二区| 日韩精品免费在线| 在线观看日韩视频| 欧美日韩日本国产| 国产香蕉97碰碰久久人人| 亚洲人成电影网站色| 在线亚洲国产精品网| 午夜精品美女自拍福到在线| 日韩精品福利网站| 久操成人在线视频| 国产91精品黑色丝袜高跟鞋| 揄拍成人国产精品视频| 美女av一区二区| 成人妇女免费播放久久久| 亚洲精品成人久久久| 欧美在线免费看| 亚洲伦理中文字幕| 5252色成人免费视频| 丝袜亚洲另类欧美重口| 亚洲曰本av电影| 亚洲aⅴ日韩av电影在线观看| 亚洲丝袜av一区| 精品亚洲国产成av人片传媒| 久久精品99无色码中文字幕| 91精品在线影院| 法国裸体一区二区| 中文字幕精品av| 亚洲成人久久一区| 国产精品欧美一区二区三区奶水| 亚洲专区中文字幕| 91成人性视频| 青青草一区二区| 欧美电影在线免费观看网站| 国产精品美女久久久免费| 国产欧美一区二区三区视频| 日韩免费高清在线观看| 九九久久久久久久久激情| 欧美极品在线播放| 欧美日韩中文在线| 久操成人在线视频| 91chinesevideo永久地址| 久久人人97超碰精品888| 成人97在线观看视频| 久久久久九九九九| 欧美一区亚洲一区| 亚洲国产精品字幕| 91av视频在线免费观看| 亚洲成人久久电影| 国产精品亚洲视频在线观看| 视频一区视频二区国产精品| 亚洲一区二区中文| 国产精品劲爆视频| 91国产在线精品| 在线观看欧美成人| 国产精品av电影| 精品美女国产在线| 日韩av综合网| 色婷婷成人综合| 超薄丝袜一区二区| 91久久精品国产91性色| 国产一区二区三区在线免费观看| 国产精品欧美一区二区| 一本大道亚洲视频| 日本精品久久久久影院| 亚洲精品自拍第一页| 亚洲成人中文字幕| 欧美成人精品xxx| 成人伊人精品色xxxx视频| 欧美激情视频在线| 亚洲视频在线免费观看| 国产91色在线| 成人a在线视频| 亚洲第一精品自拍| 97国产真实伦对白精彩视频8| 国产精品人人做人人爽| 亚洲成人a级网| 精品视频—区二区三区免费| 中文字幕视频在线免费欧美日韩综合在线看| 国产综合视频在线观看| 久久久国产一区二区三区| 91av国产在线| 都市激情亚洲色图| 91精品久久久久久久久久久久久| 久久成年人免费电影| 欧美日韩亚洲视频一区| 亚洲区免费影片| 国产91色在线|免| 国产精品第一页在线| 91国内免费在线视频| 色综合伊人色综合网| 国产美女扒开尿口久久久| 亚洲精品丝袜日韩| 日韩中文av在线| 久久久久久成人精品|