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"