将Javascript函数绑定到变量

时间:2017-08-30 17:08:24

标签: javascript arrays

我正在尝试将toLowerCasetoUpperCase中的一个绑定到一个变量,而我却错过了一些步骤。这是我的代码的简化版本:

for(let i = 0; i < arr.length; i++) {
    if(flag) {
        arr[i] = arr[i].toUpperCase();
    }
    else {
        arr[i] = arr[i].toLowerCase();
    }
}

我希望我可以做类似的事情:

let func = flag  ? String.prototype.toUpperCase : String.prototype.toLowerCase;
arr = arr.map(x=>func(x));

虽然我可以设置该功能,但看起来我没有正确使用它,因为我得到了Uncaught TypeError: String.prototype.toLowerCase called on null or undefined。我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

可以这样做,但你必须使用.call(或.apply)才能在{{1}的调用中正确设置this 1}} / toUpperCase,因为他们希望看到字符串用作toLowerCase,而不是传递参数:

this

(我也从let func = flag ? String.prototype.toUpperCase : String.prototype.toLowerCase; arr = arr.map(x=>func.call(x)); //-------------------^^^^^ 前面的let放弃了第二行,arr位于arr的右侧将是=。[或者,根据之前声明的undefined的位置/方式,这将是一个错误。])

示例:

arr

另一种选择是给自己一个包装函数,然后你可以按照你想要的方式调用它:

let arr = ["one", "TWO", "three", "FOUR"];
const flag = Math.random() < 0.5;
console.log("Flag is: " + flag);
let func = flag  ? String.prototype.toUpperCase : String.prototype.toLowerCase;
arr = arr.map(x=>func.call(x));
console.log(arr);

示例:

let func = flag ? s => s.toUpperCase() : s => s.toLowerCase();
arr = arr.map(x=>func(x));

但在这种特定情况下,更简单的方法是使用括号表示法和字符串函数名称:

let arr = ["one", "TWO", "three", "FOUR"];
const flag = Math.random() < 0.5;
console.log("Flag is: " + flag);
let func = flag ? s => s.toUpperCase() : s => s.toLowerCase();
arr = arr.map(x=>func(x));
console.log(arr);

示例:

let funcName = flag  ? "toUpperCase" : "toLowerCase";
arr = arr.map(x=>x[funcName]());

答案 1 :(得分:2)

您可以使用func.call(x) call功能 - 请参阅下面的演示:

&#13;
&#13;
let func = true  ? String.prototype.toUpperCase : String.prototype.toLowerCase;
let arr = ['test', 'TEST', "Test"].map(x=>func.call(x));
console.log(arr);
&#13;
&#13;
&#13;