这是我坚持的代码。
var bind = function(func, thisValue) {
return function() {
return func.apply(thisValue, arguments);
}
}
我一直在学习执行上下文和闭包。我的猜测是第一个return语句中的函数是一个函数表达式,因为它是一个语句的一部分。但是,我不知道如何创建一个关于func和thisValue的闭包。
如果它是一个函数表达式,那么当调用bind时,匿名函数将不会在那里进行评估,因此不会设置一个带有[[scope]]属性的函数对象,该属性包含bind的执行上下文。因此,匿名函数无法通过它的[[scope]]属性访问func和thisValue。
因此,如果代码确实形成了一个闭包,那么我的猜测是错误的,并且第一个return语句中的函数必须是函数声明。或者也许我在评估回报时会产生误解?任何有关这方面的帮助将不胜感激!
答案 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.key
与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"