Vadim 和 Corbin 大部分都是正确的,但是为了增加一点具体性和冗长性(我说大话),bind_1 返回一个函数,该函数将始终调用给定函数 (f),并将给定参数 (o) 设置为上下文 - 设置上下文意味着在函数内部this关键字将引用分配的上下文对象。而 bind_2 将返回:带有上下文 (o) 的函数 (f),或者返回带有上下文 (o) 调用函数 (f) 的结果。
Function.prototype.bind 也可以用于部分函数应用。例如,如果您不想在函数中使用上下文,您可以为函数提供已应用的参数,从而简化后续调用:
// define a function which expects three arguments
function doSomething (person, action, message) {
return person + " " + action + " " + message + ".";
}
var shortcut = doSomething.bind(null, "Joshua", "says");
// the call to bind here returns a function based on doSomething with some changes:
// 1. the context (_this_) is set to null
// 2. the arguments (person and action) are defined ("Joshua" and "says") and not changeable
// now we can use shortcut("Hello")
// instead of doSomething("Joshua", "says", "Hello")
shortcut("Hello"); // returns "Joshua says Hello."
传递给 .apply()、.call() 或 .bind() 的第一个参数正在更改函数/方法的上下文。上下文是this关键字的值;因此,在函数内部,this值将是作为第一个参数传递的任何值。这里我使用了null,因为在这种情况下,函数不需要上下文的特定值;并且null比undefined字符少,并且感觉比一些垃圾值(“” - 空字符串,{} - 空对象等)更好。所以剩下的两个变量被分配给函数的第一组参数。
function exampleContext () {
return this; // context of function execution
}
exampleContext(); // returns the global scope "window" (in the browser)
var exampleBind = exampleContext.bind(null);
exampleBind(); // returns "null"
var exampleBind = exampleContext.bind("Joshua");
exampleBind(); // returns "Joshua"
var exampleBind = exampleContext.bind({});
exampleBind(); // returns "Object {}""