我创建了这个函数,以便我可以链接多个方法:
所以我的问题是:是否有可靠的方法来检测函数是否使用绑定运算符调用?
export default function bindable(fn) {
return function boundFn(...args) {
return this === undefined ? fn(...args) : fn(this, ...args);
}
}
它可以与bind运算符一起使用。例如,你可以像这样定义一个新函数:
export const flatten = bindable(arrayOfArrays => Array.prototype.concat(...arrayOfArrays));
然后像这样使用:
[[1,2,3],[4,5,6]]::flatten()
或者像这样:
flatten([[1,2,3],[4,5,6]])
这个方法在一开始运行得很好,但后来我发现,如果像第二种情况那样将它作为模块导入,它会破坏上下文!
import * as Arr from './array-helper-methods';
Arr.flatten([1,2,3]); // `this` is now `Arr`
所以我的问题是:是否有可靠的方法来检测函数是否使用绑定运算符调用?
Array.prototype.concat
而不仅是使用[...arrayOfArrays]
呢?我还怀疑这个问题无法回答,因为它取决于绑定操作符的实现细节,而我不记得规范中有任何能够启用那种程度的内省的东西。但我很愿意被证明是错的。 - Jared Smith> [...arrayOfArrays] [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] > Array.prototype.concat(...arrayOfArrays) [ 1, 2, 3, 4, 5, 6 ]
- mpenthis
的函数不是更简单吗?然后你就可以在导入任何纯函数时调用它。如果你无论如何都要使用bind语法,为什么还需要函数在没有this
上下文的情况下仍然可以工作呢? - sbkingbindable
的作用,不是吗?将一个纯函数变成可使用“this”调用的函数——除非“this”未定义,那么它也能像“纯”的方式一样被调用。 如果我删除了“This”检查,它将无歧义地运行,但这样我就需要两个版本的每个函数,这只会让管理变得很麻烦。 - mpenbindable
,因此你已经有了两个函数版本。我猜我不明白为什么你想在同一个模块文件中以两种不同的方式使用该函数。那听起来很令人困惑。 - sbkingbindable
和数组函数。我不想强制消费者在开始链接之前用bindable
包装他们想使用的每个函数。我的库会预先导出它们。 - mpen