当从函数返回一个匿名函数时,返回语句中的函数是函数声明还是函数表达式?
When returning an anonymous function from a function, is the function in the return statement a function declaration or function expression?
这是我卡住的代码
var bind = function(func, thisValue) {
return function() {
return func.apply(thisValue, arguments);
}
}
我一直在学习执行上下文和闭包。我的猜测是,第一个返回语句中的函数是一个函数表达式,因为它是语句的一部分。然而,我不知道一个闭包是如何创建的,它引用了func和thisValue。
如果它是一个函数表达式,那么当bind被调用时,匿名函数不会在那里被求值,因此不会有一个用包含bind执行上下文范围的[[scope]]属性设置的函数对象。因此,匿名函数不能通过它的[[scope]]属性访问func和thisValue。
因此,如果代码确实形成了闭包,那么我的猜测是错误的,第一个返回语句中的函数必须是函数声明。或者我误解了return是什么时候计算的?任何帮助,这将是非常感激!
所以我在ECMAScript语言规范中做了一些挖掘,得出的结论是,返回的匿名函数是一个函数表达式…现在看起来真的很简单。当使用函数声明定义函数时,标识符不是可选的,因此不能使用函数声明定义匿名函数。匿名函数只能使用函数表达式定义,因为对于函数表达式,标识符是可选的。
我也说过这个…
我错了。当bind()返回时计算函数表达式。因此,为它设置了一个函数对象,并且所有内容都有其应有的作用域。 我希望我说得有道理。如果我错过了什么,请评论!如果它是一个函数表达式,那么当bind被调用时,匿名函数不会立即被求值,因此不会有一个用包含bind执行上下文范围的[[scope]]属性设置的函数对象。
这看起来很复杂,但实际上很简单。这个函数所做的是返回一个函数,其中您传递的参数被绑定到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
在我的示例中)。
额外参数示例:
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"
- ES6构造函数返回基类的实例
- 从函数返回角度承诺
- 如何从jquery函数返回变量
- 根据是否解析了 Promise 从函数返回值
- Javascript函数返回未定义
- 如果函数返回True,则显示Javascript按钮
- Google Sheet自定义函数返回0
- 从Ajax函数返回值
- 使用for循环从Javascript中的函数返回多个值
- 谷歌地图:函数返回未定义的值在console.log中运行良好
- 从函数中的函数返回数组时出错
- 如何从嵌套的API函数返回值
- 从Mongoose结果匿名函数返回父函数
- 函数返回错误'令牌{'
- Jquery函数返回订单问题
- Mocha/Chai测试链接到函数返回断言错误
- 从异步函数返回值
- 函数返回后更新变量
- 我如何才能继续'如果'语句来比较作为参数的多个函数返回值
- 将外部函数返回的id传递给内部函数