Javascript 使用调用引用函数

Javascript 使用调用引用函数,javascript,function,Javascript,Function,我试图引用Javascript内置函数,但无法引用call函数并以其他名称使用它 要求如下: 在单元测试中,函数的调用类似于foo('string') 最好不要创建新函数,而是创建一个有效的函数引用 const s='ABCDEFG'; console.log(“”.toLowerCase.call));//正确输出“abcdefg” const foo=''.toLowerCase.call; console.log(foo);//正确输出“函数调用(){[本机代码]}” 傅(s);//

我试图引用Javascript内置函数,但无法引用
call
函数并以其他名称使用它

要求如下:

  • 在单元测试中,函数的调用类似于
    foo('string')
  • 最好不要创建新函数,而是创建一个有效的函数引用
const s='ABCDEFG';
console.log(“”.toLowerCase.call));//正确输出“abcdefg”
const foo=''.toLowerCase.call;
console.log(foo);//正确输出“函数调用(){[本机代码]}”

傅(s);//抛出“foo不是函数”
您可以将
foo
用作函数:

const foo = function(data){ 
    return ''.toLowerCase.call(data)
};  
现在调用
foo(s)
,它将给出预期的结果:

const foo=函数(数据){
返回“”。toLowerCase.call(数据)
};
常数s='ABCDEFG';
console.log(foo(s))
使用以下命令:

foo = String.prototype.toLowerCase.call.bind(String.prototype.toLowerCase)
foo(s)
或者这个:

foo = String.prototype.toLowerCase.call;
foo.call(String.prototype.toLowerCase, s)
这看起来很不直观,但事实上,所有本机函数上的所有
call
函数都完全相同。JS引擎不会创建单独的函数(就像它通常为非本机调用所做的那样)。这意味着为了调用
调用
,您需要提供它的
This
作为第一个参数,就像我在上面的示例中所做的那样-通过调用
foo.call(ActualFunction)
或通过绑定。下面是一个简短的代码片段,它表明所有
call
函数实际上都是相同的:

让x=String.prototype.toLowerCase.call;
设y=String.prototype.toUpperCase.call;
设z=String.prototype.indexOf.call;
log(Object.is(x,y));
log(Object.is(x,z));
//甚至跨越不同的原型!
设w=parseInt.call;

log(Object.is(x,w))我试图引用一个已经存在的函数,而不是创建一个新函数;foo.call(s)FF中的错误消息可能会清楚地表明发生了什么:“Function.prototype.call在不兼容的未定义上被调用”。很好的信息,我使用了最短的版本:
const foo=Object.call.bind('.toLowerCase)这将创建一个新函数。