我正在尝试引用Javascript内置函数,但我无法设法引用call
函数并以其他名称使用它。
要求是:
foo('string')
。
const s = 'ABCDEFG';
console.log(''.toLowerCase.call(s)); // Correctly outputs 'abcdefg'
const foo = ''.toLowerCase.call;
console.log(foo); // Correctly outputs 'function call() { [native code] }'
foo(s); // Throws 'foo is not a function'
要进行比较,如果我使用自己的函数,函数引用会起作用。
function call (x) {
return x.toLowerCase();
}
const s = 'ABCDEFG';
console.log(call(s)); // Outputs 'abcdefg'
foo = call;
console.log(foo); // Outputs 'function...'
foo(s); // 'abcdefg'
也许Javascript的功能特性如部分或currying会有所帮助,但我无法理解如何使它工作。
答案 0 :(得分:1)
您可以将foo
用作功能:
const foo = function(data){
return ''.toLowerCase.call(data)
};
现在拨打foo(s)
,它会给出预期的结果:
const foo = function(data) {
return ''.toLowerCase.call(data)
};
const s = 'ABCDEFG';
console.log(foo(s))
答案 1 :(得分:1)
使用此:
foo = String.prototype.toLowerCase.call.bind(String.prototype.toLowerCase)
foo(s)
或者这个:
foo = String.prototype.toLowerCase.call;
foo.call(String.prototype.toLowerCase, s)
这似乎非常直观,但实际上所有本机函数上的所有call
函数都完全相同。 JS引擎不会创建单独的函数(通常用于非本机调用)。这意味着,为了调用call
,您需要提供其this
作为我在上面示例中所做的第一个参数 - 通过调用foo.call(ActualFunction)
或通过绑定。这是一个简短的代码段,显示所有call
函数实际上都是相同的:
let x = String.prototype.toLowerCase.call;
let y = String.prototype.toUpperCase.call;
let z = String.prototype.indexOf.call;
console.log(Object.is(x, y));
console.log(Object.is(x, z));
// Even across different prototypes!
let w = parseInt.call;
console.log(Object.is(x, w));