国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript 反科里化 this [譯]

2024-05-06 14:21:10
字體:
來源:轉載
供稿:網友
本文主要講了JavaScript中科里化和反科里化this的方法.話題來自于Brendan Eich(JavaScript之父)的一個tweet.

1.反科里化(Uncurrying)this

反科里化this的意思是:把一個簽名如下的方法:

obj.foo(arg1, arg2)轉換成另外一個簽名如下的函數:

foo(obj, arg1, arg2)想要知道這么做有什么用,我們首先得了解一下通用方法.

2.通用方法(Generic methods)

通常情況下,某個特定的方法只能在某種特定類型的對象實例上使用.但是,有一些方法如果還可以使用在其他類型的對象實例上的話,那會非常有用,例如:
代碼如下:
// 實際實現的簡化版本:
Array.prototype.forEach = function (callback) {
for(var i=0; i<this.length; i++) {
if (i in this) {
callback(this[i], i);
}
}
};

this可以看做是forEach()方法的隱含參數.滿足下面這三條規則的對象都可以調用forEach()方法,都可以作為這個隱含的this:

•具有length屬性: this.length
•能夠通過索引訪問對象元素: this[i]
•能夠檢查屬性的存在性: i in this
arguments對象(包含了一次函數調用的所有實參)不是一個Array實例,所以它不能直接調用forEach()方法.但是你它滿足調用forEach方法的三個條件.為了讓該對象能夠調用到forEach()方法,我們只需要讓隱含的this參數作為顯式參數.幸運的是,每個函數都有call()方法讓我們來做件事:

代碼如下:
function printArgs() {
    Array.prototype.forEach.call(arguments, function (elem, index) {
        console.log(index+". "+elem);
    });
}

forEach.call()比forEach()方法多一個參數:它的第一個參數就是指定的this值:
代碼如下:
> printArgs("a", "b")
0. a
1. b

JavaScript中有幾個類似的通用方法都可以以這種方式來調用,這些方法大部分來自Array.prototype.

3.反科里化this的幾個用途

用例1:通過map()調用一個方法. Array.prototype.map()方法允許你在一個數組中的每個元素上調用一個函數.但如果你想調用的不是函數還是方法呢?可以利用反科里化this這么做:
代碼如下:
> var toUpperCase = String.prototype.toUpperCase.uncurryThis();
> [ "foo", "bar", "baz" ].map(toUpperCase)
[ 'FOO', 'BAR', 'BAZ' ]

用例2:將一個通用方法轉換成函數. 利用反科里化this可以將一個方法轉換成一個用法更簡單的函數.比如:
代碼如下:
Array.forEach = Array.prototype.forEach.uncurryThis();
function printArgs() {
    Array.forEach(arguments, function (elem, index) {
        console.log(index+". "+elem);
    });
}

在未來版本的ECMAScript規范建議中已經有了很多類似的數組方法.
譯者注:Firefox已經實現了Array.map

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扎囊县| 集贤县| 衡山县| 凤凰县| 资中县| 怀远县| 长顺县| 乌兰浩特市| 黔江区| 准格尔旗| 东源县| 武隆县| 镇康县| 桑日县| 吉首市| 灵山县| 绍兴市| 富蕴县| 安顺市| 延吉市| 新巴尔虎左旗| 河池市| 密云县| 双鸭山市| 萨嘎县| 女性| 东台市| 资中县| 长垣县| 彭州市| 聊城市| 蓝田县| 平阴县| 孝昌县| 富锦市| 萍乡市| 吉隆县| 六枝特区| 水城县| 桐乡市| 鸡西市|