使用call

时间:2018-01-03 05:06:08

标签: javascript function

我正在尝试引用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会有所帮助,但我无法理解如何使它工作。

2 个答案:

答案 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));