从函数返回匿名函数时,return语句中的函数是函数声明还是函数表达式?

时间:2011-08-11 21:21:23

标签: javascript

这是我坚持的代码。

var bind = function(func, thisValue) {

  return function() {

    return func.apply(thisValue, arguments);

  }

}

我一直在学习执行上下文和闭包。我的猜测是第一个return语句中的函数是一个函数表达式,因为它是一个语句的一部分。但是,我不知道如何创建一个关于func和thisValue的闭包。

如果它是一个函数表达式,那么当调用bind时,匿名函数将不会在那里进行评估,因此不会设置一个带有[[scope]]属性的函数对象,该属性包含bind的执行上下文。因此,匿名函数无法通过它的[[scope]]属性访问func和thisValue。

因此,如果代码确实形成了一个闭包,那么我的猜测是错误的,并且第一个return语句中的函数必须是函数声明。或者也许我在评估回报时会产生误解?任何有关这方面的帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

所以我在ECMAScript Language Specification中进行了一些挖掘,并得出结论,返回的匿名函数是一个函数表达式......现在看起来真的很简单。使用函数声明定义函数时,标识符不是可选的,因此无法使用函数声明定义匿名函数。匿名函数只能使用函数表达式定义,因为使用函数表达式时,标识符是可选的。

我也说过这个......

  

如果它是一个函数表达式,那么当调用bind时,匿名函数将不会在那里进行评估,因此不会设置一个带有[[scope]]属性的函数对象,该属性包含bind的执行上下文。

我错了。 bind()返回时计算函数表达式。因此,为它设置了一个函数对象,并且所有内容都应该是它应该的范围。

我希望我有一些道理。如果我错过了任何内容,请发表评论!

答案 1 :(得分:1)

这看起来很复杂但实际上非常简单。该函数的作用是返回一个函数,其中您传递的参数绑定到thisValue

以下是一个例子:

var bind = function(func, thisValue) {
    return function() {
        return func.apply(thisValue, arguments);
    }
}

var x = {
    "key": "the value"
};
var y = {
    "key": "the y value"
};

function alert_key() {
    alert(this.key);
}

var bound_function = bind(alert_key, x);
bound_function();   // alerts "the value"
var bound_function2 = bind(alert_key, y);
bound_function2();  // alerts "the y value"

重要的是要认识到this中的this.keyx绑定,因为它是func.apply(thisValue, arguments)

中的第一个参数

arguments是一个神奇的JavaScript变量,它将包含传递给函数的所有参数。所以func.apply(thisValue, arguments)实际上只是传递所有参数,但将this上下文设置为thisValue(或者我的示例中为xy)。

额外参数的示例:

var bind = function(func, thisValue) {
    return function() {
        return func.apply(thisValue, arguments);
    }
}

var x = {
    "key": "the value"
};

function alert_key(another_value) {
    alert(this.key + " " + another_value);
}

var bound_function = bind(alert_key, x);
bound_function("another value");    // alerts "the value another value"
bound_function("value y");  // alerts "the value value y"