Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.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 从函数返回匿名函数时,return语句中的函数是函数声明还是函数表达式?_Javascript - Fatal编程技术网

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

Javascript 从函数返回匿名函数时,return语句中的函数是函数声明还是函数表达式?,javascript,Javascript,这就是我一直坚持的密码 var bind = function(func, thisValue) { return function() { return func.apply(thisValue, arguments); } } 我一直在学习执行上下文和闭包。我猜第一个return语句中的函数是一个函数表达式,因为它是语句的一部分。然而,我不知道引用func和thisValue的闭包是如何创建的 如果它是一个函数表达式,那么在调用bind时,匿名函数不会在那里求值,因

这就是我一直坚持的密码

var bind = function(func, thisValue) {

  return function() {

    return func.apply(thisValue, arguments);

  }

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

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


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

这看起来很复杂,但实际上很简单。此函数的作用是返回一个函数,其中您传递的参数绑定到
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
(在我的示例中是
x
y

额外参数的示例:


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

我也说过这个

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

我错了。函数表达式在bind()返回时求值。因此,为它设置了一个函数对象,并且所有内容都按其应有的范围进行了限定


我希望我说得有道理。如果我遗漏了什么,请评论

谢谢你试着吃这个馅饼!但这并不是我一直坚持的目标:-)。看下面。啊,我明白了,我读了“结束”,跳过了问题的其余部分。愚蠢的我。你可以很容易地识别一个函数声明:它是一个以
function
关键字开头的语句。其他一切都是函数表达式。(嗯,不太好,但已经足够好了……)
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"