簡體   English   中英

對象函數的javascript curry / partial函數調用

[英]javascript curry/partial function invokation for object functions

我想要一個像咖喱一樣的功能 - 這種事情

function invoker (fn) {
    var slice = Array.prototype.slice,
        args = slice.apply(arguments, [1]);
    return function () {
       return fn.apply(null, args);
    };
}

但我希望用戶能夠做到

invoker(f)

要么

invoker(foo.bar)

我無法找到正確的魔法咒語來做到這一點。 我看到的所有示例都要求范圍對象單獨傳遞; 這容易出錯並且不自然。 IE

invokerx(foo.bar, foo)

無論如何還有嗎? 我不介意有兩個不同的功能

invokeG(f)
invokeO(foo.bar)

編輯:澄清

'f' is a global scope function
'foo' is an object
'bar is a method on that object

IE我希望這個咖喱工具使用“自由”功能以及對象功能。

不得不去

<curry function>(foo.bar,foo)

看起來有點笨重,我不得不兩次說'foo'

的第一個參數applythis是提供給函數。 由於您傳遞nullthis將映射到window

以下修改將起作用:

function invoker (fn, target) {
    var slice = Array.prototype.slice,
        args = slice.apply(arguments, [2]);

    if(typeof fn === 'string')
        fn = (target || window)[fn];

    return function () {
       return fn.apply(target || null, args);
    };
}

// Either will work:
invoker(foo.bar, foo);
invoker('bar', foo);

// Any of these will work:
invoker(escape, null);
invoker(escape, window);
invoker('escape', null);
invoker('escape', window);

更新添加了一個小的更改以添加對名稱傳遞的支持,因此您不必兩次傳遞對象名稱。

更新2由於我們正在討論,我們需要始終有兩個論點。

你不能。 當你做invoker(foo.bar)invoker無法知道參數是foo的成員函數。 函數不存儲它們的“所有者”,並且invoker只是傳遞對函數的引用。

你可以得到的最接近的是使用function.bind() ,如下所示:

invoker(foo.bar.bind(foo))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM