Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:在不设置函数上下文的情况下转换函数参数_Javascript_Function Binding - Fatal编程技术网

Javascript:在不设置函数上下文的情况下转换函数参数

Javascript:在不设置函数上下文的情况下转换函数参数,javascript,function-binding,Javascript,Function Binding,我的理解是,根据规范,bind()中设置的参数是最终参数,不能被覆盖 我想知道是否有任何方法可以实现这样的目标,但却不能给我想要的结果: const Student={ 姓名:“, 时间:函数(i,j){ 返回'I am:${this.name}&认为答案是:${I*j}`; } }; 常量学生1={ 姓名:“学生1” } 常数学生2={ 姓名:“学生2” } const askThemTimesBy10=Student.times.bind(null,10); console.log(askT

我的理解是,根据规范,
bind()
中设置的参数是最终参数,不能被覆盖

我想知道是否有任何方法可以实现这样的目标,但却不能给我想要的结果:

const Student={
姓名:“,
时间:函数(i,j){
返回'I am:${this.name}&认为答案是:${I*j}`;
}
};
常量学生1={
姓名:“学生1”
}
常数学生2={
姓名:“学生2”
}
const askThemTimesBy10=Student.times.bind(null,10);
console.log(askThemTimesBy10.bind(student1)(5));
console.log(askThemTimesBy10.bind(student2)(5));
显然,这是失败的,因为函数上下文在curry时是硬编码的

现在,我可以很清楚地进行如下操作:

askThemX10=函数(){
返回学生.times.bind(本,10);
}
askThemXTen=函数(i){
返回学生。时间。呼叫(这个,10,我);
}
然后像这样使用它们:

console.log(askThemX10.bind(student1)((5));
console.log(askThemXTen.bind(student1)(5));

或者我可以在
Student
等中定义curried函数,但我想知道是否有更好的方法来实现这一点。

任何时候,当您考虑使用
bind
时,您都可能做错了什么。在这种情况下,请使用普通类:

class Student {
  constructor(name) {
    this.name = name;
  }

  multiply(i, j) {
    return `I am: ${this.name} & think answer is: ${i*j}`;
  }
}
然后创建学生实例:

const students = [
  new Student("alice"),
  new Student("bob"),
  ...
]
然后将“…乘以10”函数设为全局函数:

function askStudentX10(student, i) {
  return student.multiply(i, 10);
}
或者,如果您想保持事物的美观和名称空间,请将其设置为
学生
类上的静态函数:

class Student {
  static askStudentX10(student, i) {
    return student.multiply(i, 10);
  }

  constructor(name) {
    ...
  }

  ...
}

漂亮且明确的代码,无需绑定,无潜在的绑定相关bug。简单明了的代码。

说到现代JS。如果您可以传输您的代码并且不怕使用实验语法,那么您可以使用部分应用程序语法实现您想要的。但不建议用于生产:)

const Student={
姓名:“,
次数(i,j){
返回'I am:${this.name}&认为答案是:${I*j}`;
}
};
常量学生1={
姓名:“学生1”
}
常数学生2={
姓名:“学生2”
}

const askThemTimesBy10=学生时间调用(?,10,?);//我会说,任何时候使用一个类,你都在做错事。很酷,但也很无聊
bind
apply
是JS比现在低得多的时候遗留下来的函数(它们仍然存在,因为我们有意识地选择从不弃用JS API,这就是为什么我们仍然有像
document.write
这样疯狂的东西),而现代类语法就是这样。使用现代的JS,而不是二十年前的JS。哈,我实际上来自一个功能性的BE背景,所以我非常喜欢我的绑定和咖喱等等。:)有趣的是在这个问题上看到了不同的观点。虽然我是在开玩笑,工具只是一个工具,
bind
仍然有用。另外,“use modern JS”参数是一个糟糕的参数。它非常有用,但在极少数情况下,这就是为什么如果在普通的现代JS中使用
bind
,那么您几乎不应该使用
bind
。就像这件事一样。如果你正在用JS编写一个transpiler,情况就不一样了,但是这个问题中的代码除了“这是一种编写JS代码的古老方式,你应该真正学习和编写现代JS”之外,没有什么值得注意的地方
const Student = {
    name: "",
    times(i, j) {
        return `I am: ${this.name} & think answer is: ${i*j}`;
    }
};

const student1 = {
    name: "student1"
}
const student2 = {
    name: "student2"
}

const askThemTimesBy10 = Student.times.call(?, 10, ?); // <--- pew pew 

console.log(askThemTimesBy10(student1, 5));
console.log(askThemTimesBy10(student2, 6));