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

javascript奇異的arguments分析

 更新時間:2010年10月20日 11:51:03   作者:  
在 Javascript 的函數(shù)中有個名為 arguments 的類數(shù)組對象。它看起來是那么的詭異而且名不經(jīng)傳,但眾多的 Javascript 庫都使用著它強大的功能。所以,它的特性需要每個 Javascript 程序員去熟悉它。
在每個函數(shù)中,都有個名為 arguments 的變量,它以類似數(shù)組的形式保存了當(dāng)前調(diào)用的參數(shù)。而它實際上并不是個數(shù)組,使用 typeof arguments 語句嘗試會返回“object”(對象),所以它不能像 Array 一樣使用 push 和 pop 等方法。即便如此,仍然可以使用下標(biāo)以及長度屬性(length)獲取它的值。

編寫靈活的函數(shù)
雖看起來名不經(jīng)傳,但的確 arguments 是非常有用的對象。比如,你可以讓函數(shù)處理不定數(shù)目的參數(shù)。在 Dean Edwards 寫的 base2 庫中,有個叫 format 的函數(shù)充分發(fā)揮了這一特性:
復(fù)制代碼 代碼如下:

function format(string) {
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
return String(string).replace(pattern, function(match, index) {
return args[index];
});
};

這個函數(shù)實現(xiàn)了模板替換,你可以在要動態(tài)替換的地方使用 %1 到 %9 標(biāo)記,然后其余的參數(shù)就會依次替換這些地方。例如:

format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");上面的腳本就會返回

"And the papers want to know whose shirt you wear" 。在這里需要注意的是,即便在 format 函數(shù)定義中,我們僅定義了個名為 string 的參數(shù)。而 Javascript 不管函數(shù)自身定義的參數(shù)數(shù)量,它都允許我們向一個函數(shù)傳遞任意數(shù)量的參數(shù),并將這些參數(shù)值保存到被調(diào)用函數(shù)的 arguments 對象中。

轉(zhuǎn)換成實際數(shù)組
雖然 arguments 對象并不是真正意義上的 Javascript 數(shù)組,但是我們可以使用數(shù)組的 slice 方法將其轉(zhuǎn)換成數(shù)組,類似下面的代碼
復(fù)制代碼 代碼如下:

var args = Array.prototype.slice.call(arguments);

這樣,數(shù)組變量 args 包含了所有 arguments 對象包含的值。

創(chuàng)建預(yù)置參數(shù)的函數(shù)
使用 arguments 對象能夠簡短我們編寫的 Javascript 代碼量。下面有個名為 makeFunc 的函數(shù),它根據(jù)你提供的函數(shù)名稱以及其他任意數(shù)目的參數(shù),然后返回個匿名函數(shù)。此匿名函數(shù)被調(diào)用時,合并的原先被調(diào)用的參數(shù),并交給指定的函數(shù)運行然后返回其返回值。
復(fù)制代碼 代碼如下:

function makeFunc() {
var args = Array.prototype.slice.call(arguments);
var func = args.shift();
return function() {
return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
};
}

makeFunc 的第一個參數(shù)指定需要調(diào)用的函數(shù)名稱(是的,在這個簡單的例子中沒有錯誤檢查),獲取以后從 args 中刪除。makeFunc 返回一個匿名函數(shù),它使用函數(shù)對象的(Function Object)apply 方法調(diào)用指定的函數(shù)。

apply 方法的第一個參數(shù)指定了作用域,基本上的作用域是被調(diào)用的函數(shù)。不過這樣在這個例子中看起來會有點復(fù)雜,所以我們將其設(shè)定成 null ;其第二個參數(shù)是個數(shù)組,它指定了其調(diào)用函數(shù)的參數(shù)。makeFunc 轉(zhuǎn)換其自身的 arguments 并連接匿名函數(shù)的 arguments,然后傳遞到被調(diào)用的函數(shù)。

有種情況就是總是要有個輸出的模板是相同的,為了節(jié)省每次是使用上面提到的 format 函數(shù)并指定重復(fù)的參數(shù),我們可以使用 makeFunc 這個工具。它將返回一個匿名函數(shù),并自動生成已經(jīng)指定模板后的內(nèi)容:
復(fù)制代碼 代碼如下:

var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");

你可以像這樣重復(fù)指定 majorTom 函數(shù):
復(fù)制代碼 代碼如下:

majorTom("stepping through the door");
majorTom("floating in a most peculiar way");

那么當(dāng)每次調(diào)用 majorTom 函數(shù)時,它都會使用第一個指定的參數(shù)填寫已經(jīng)指定的模板。例如上述的代碼返回:
復(fù)制代碼 代碼如下:

"This is Major Tom to ground control. I'm stepping through the door."
"This is Major Tom to ground control. I'm floating in a most peculiar way."

自引用的函數(shù)
您可能會認(rèn)為這很酷,先別急著高興,后面還有個更大的驚喜。它(arguments)還有個其他非常有用的屬性:callee 。arguments.callee 包含了當(dāng)前調(diào)用函數(shù)的被引用對象。那么我們?nèi)绾问褂眠@玩意做些的事情?arguments.callee 是個非常有用的調(diào)用自身的匿名函數(shù)。

下面有個名為 repeat 的函數(shù),它的參數(shù)需要個函數(shù)引用和兩個數(shù)字。第一個數(shù)字表示運行的次數(shù),而第二個函數(shù)定義運行的間隔時間(毫秒為單位)。下面是相關(guān)的代碼:
復(fù)制代碼 代碼如下:

function repeat(fn, times, delay) {
return function() {
if(times-- > 0) {
fn.apply(null, arguments);
var args = Array.prototype.slice.call(arguments);
var self = arguments.callee;
setTimeout(function(){self.apply(null,args)}, delay);
}
};
}

repeat 函數(shù)使用 arguments.callee 獲得當(dāng)前引用,保存到 self 變量后,返回個匿名函數(shù)重新運行原本被調(diào)用的函數(shù)。最后使用 setTimeout 以及配合個匿名函數(shù)實現(xiàn)延遲執(zhí)行。

作為個簡單的說明,比如會在通常的腳本中,編寫下面的提供個字符串并彈出個警告框的簡單函數(shù):
復(fù)制代碼 代碼如下:

function comms(s) {
alert(s);
}

好了,后來我改變了我的想法。我想編寫個“特殊版本”的函數(shù),它會重復(fù)三次運行每次間隔兩秒。那么使用我的 repeat 函數(shù),就可以像這樣做到:
復(fù)制代碼 代碼如下:

var somethingWrong = repeat(comms, 3, 2000);
somethingWrong("Can you hear me, major tom?");

結(jié)果就猶如預(yù)期的那樣,彈出了三次警告框每次延時兩秒。

最后,arguments 即便不會經(jīng)常被用到,甚至顯得有些詭異,但是它上述的那些驚艷的功能(不僅僅是這些?。┲档媚闳チ私馑?。

相關(guān)文章

  • 淺談Javascript 數(shù)組與字典

    淺談Javascript 數(shù)組與字典

    這篇文章主要簡單介紹了Javascript數(shù)組與字典,需要的朋友可以參考下
    2015-01-01
  • uniapp小程序開發(fā)組件封裝之自定義輪播圖效果

    uniapp小程序開發(fā)組件封裝之自定義輪播圖效果

    這篇文章主要介紹了uniapp小程序開發(fā)組件封裝之自定義輪播圖,本文主要展示小程序端封裝輪播圖組件,使用的是uniapp進(jìn)行的開發(fā),主要使用的是uniapp官網(wǎng)提供的swiper組件,需要的朋友可以參考下
    2023-02-02
  • 一文詳解JavaScript中的Mixin

    一文詳解JavaScript中的Mixin

    類的出現(xiàn)最終使JavaScript非常容易使用繼承法,JavaScript類比大多數(shù)人意識到的更強大,它是構(gòu)建真正的mixins的良好基礎(chǔ),本文介紹JavaScript中的Mixin介紹的非常詳細(xì),需要的小伙伴可以參考閱讀一下
    2023-04-04
  • ExtJs中g(shù)ridpanel分組后組名排序?qū)嵗a

    ExtJs中g(shù)ridpanel分組后組名排序?qū)嵗a

    這篇文章主要介紹了ExtJs中g(shù)ridpanel分組后組名排序?qū)嵗a,有需要的朋友可以參考一下
    2013-12-12
  • 使用JavaScript平移和縮放圖像的示例代碼

    使用JavaScript平移和縮放圖像的示例代碼

    平移和縮放是查看圖像時常用的功能,我們可以放大圖像以查看更多細(xì)節(jié),進(jìn)行圖像編輯,Dynamsoft Document Viewer是一個用于此目的的SDK,它為文檔圖像提供了一組查看器,在本文中,我們將演示如何使用它來平移和縮放圖像,需要的朋友可以參考下
    2024-08-08
  • JS JQuery獲取data-*屬性值方法解析

    JS JQuery獲取data-*屬性值方法解析

    這篇文章主要介紹了JS JQuery獲取data-*屬性值方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • js實現(xiàn)簽到日歷

    js實現(xiàn)簽到日歷

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)簽到日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • bootstrap fileinput實現(xiàn)文件上傳功能

    bootstrap fileinput實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了bootstrap fileinput實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Firefox和IE瀏覽器兼容JS腳本寫法小結(jié)

    Firefox和IE瀏覽器兼容JS腳本寫法小結(jié)

    window.event兼容腳本 1.2.屏蔽Form提交事件 3.獲取事件源 4.添加事件兼容寫法 5.Firefox注冊innerText寫法 6.長度 7.父控件下的子控件 8.XmlHttp
    2008-07-07
  • DPlayer.js視頻播放插件使用方法

    DPlayer.js視頻播放插件使用方法

    這篇文章主要為大家詳細(xì)介紹了JSx實現(xiàn)簡單控制視頻播放倍速,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04

最新評論

光泽县| 阜宁县| 博乐市| 大安市| 宣城市| 新干县| 筠连县| 兴宁市| 安陆市| 六枝特区| 凤山市| 铜陵市| 泰来县| 光泽县| 图们市| 平遥县| 灵丘县| 甘孜县| 巴彦县| 墨脱县| 高安市| 吉安县| 玉屏| 阳原县| 邛崃市| 岱山县| 新营市| 崇信县| 榆中县| 天柱县| 衡阳县| 崇仁县| 锦屏县| 临漳县| 富蕴县| 阿拉善右旗| 灌南县| 汉源县| 凉山| 丹东市| 芜湖县|