2013-11-21 42 views
1

我想編寫一個函數,它將一個函數和一些其他對象作爲參數,並將這些參數作爲函數的默認參數並返回一個新函數。訪問外部調用者函數參數

假設我們有drawRect中(X,Y,X2,Y2)我想寫一個名爲 '部分',以便

(partial(drawRect, 0, 0))(x2, y2); 

等於

drawRect(0, 0, x2, y2); 

請注意,我的功能想要功能部分靈活,所以它需要任何函數和任意數量的參數。

到目前爲止,我已經寫了這一點:

function temp(a, b, c, d){ 
    document.write(a + b + c + d); 
} 

function partial(func){ 
    var arr = new Array(); 
    for (var i = 0; i<arguments.length; i++){ 
    arr.push(arguments[i+1]); 
    } 

    var tf = function(){f.apply(this, arr.concat(func.arguments))} 
    console.log(2); 
    return tf; 
} 

var ff = partial(temp, 44, 55); 
ff(20, 30); 

,但文件上寫了一個「男」。我需要在調用時訪問函數'ff'參數,但我不知道如何去做。 你們能幫我解決這個問題嗎?

+1

這就是所謂的做[柯里(http://javascript.crockford.com/www_svendtofte_com/code/curried_javascript/index.html)。 – Mathletics

+0

它好像* currying,但嚴格來說它不同,因爲JavaScript不是懶惰評估語言。 (我不是100%確定誰負責術語;我瞭解其中的差異,但我不知道誰在乎這個術語是如何使用的:) – Pointy

回答

2

在那裏似乎有很多不知情的測試代碼,我已經清理了。據我的理解,下面的代碼和this demo做你需要的。

function temp(a, b, c, d){ 
    console.log(a + b + c + d); 
} 

function partial(f){ 
    var defaultArgs = Array.prototype.slice.call(arguments, 1); 
    var that = this; 

    var tf = function(){ 
     f.apply(that, defaultArgs.concat(Array.prototype.slice.call(arguments))); 
    } 
    return tf; 
} 

var ff = partial(temp, 44, 55); 
ff(20, 30); 

// console output: 149 
+0

啊非常感謝! 調用(參數,1)中的'1'是什麼? –

+1

@alireza我同時將'arguments'對象轉換爲一個數組,並從中排除第一個元素。就你的原始代碼而言,這相當於調用'arr.slice(1)',它將從第二個元素開始檢索整個'arr'。 –

2

您可以.bind()

function partial(f, x, y) { 
    return f.bind(this, x, y); 
} 
+0

+1,不知道這個。綁定函數只是一個具有不同邏輯的常規函數​​,或者它們在某種程度上是不同的? –

+0

它們是「常規函數」,但它們是以特定方式構建的。在大多數情況下,這與其他答案沒有多大區別。 [MDN頁面詳細介紹。](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) – Pointy