使用内部函数返回外部函数的必要性是什么?

时间:2012-05-12 08:50:42

标签: javascript

这两个功能有什么区别?

function bind_1(f, o) {
    if (f.bind)
        return f.bind(o);
    else
        return function() { return f.apply(o. arguments); };
}

function bind_2(f, o) {
    if (f.bind)
        return f.bind(o);
    else
        return f.apply(o. arguments);
}

3 个答案:

答案 0 :(得分:3)

Vadim和Corbin都是正确的,但是为了增加一点特异性和冗长性(我说大字),bind_1返回一个函数,总是用给定的函数调用给定的函数(f) arguments(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 {}""

答案 1 :(得分:1)

bind_1返回一个函数,该函数在调用时使用f执行o.arguments

bind_2立即使用f执行o.arguments

至于“必要性”,我无法立即看到。在某些人的代码中,它显然有一个目的。

答案 2 :(得分:0)

在大多数情况下,完成了将不同的上下文(this值)“附加”到函数中。