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

When returning an anonymous function from a function, is the function in the return statement a function declaration or function expression?

本文关键字:函数 返回 语句 表达式 声明 一个      更新时间:2023-09-26

这是我卡住的代码

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

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

如果它是一个函数表达式,那么当bind被调用时,匿名函数不会在那里被求值,因此不会有一个用包含bind执行上下文范围的[[scope]]属性设置的函数对象。因此,匿名函数不能通过它的[[scope]]属性访问func和thisValue。

因此,如果代码确实形成了闭包,那么我的猜测是错误的,第一个返回语句中的函数必须是函数声明。或者我误解了return是什么时候计算的?任何帮助,这将是非常感激!

所以我在ECMAScript语言规范中做了一些挖掘,得出的结论是,返回的匿名函数是一个函数表达式…现在看起来真的很简单。当使用函数声明定义函数时,标识符不是可选的,因此不能使用函数声明定义匿名函数。匿名函数只能使用函数表达式定义,因为对于函数表达式,标识符是可选的。

我也说过这个…

如果它是一个函数表达式,那么当bind被调用时,匿名函数不会立即被求值,因此不会有一个用包含bind执行上下文范围的[[scope]]属性设置的函数对象。

我错了。当bind()返回时计算函数表达式。因此,为它设置了一个函数对象,并且所有内容都有其应有的作用域。 我希望我说得有道理。如果我错过了什么,请评论!

这看起来很复杂,但实际上很简单。这个函数所做的是返回一个函数,其中您传递的参数被绑定到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.key中的this必然是x,因为它是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"