我有这段代码:
function outside() {
var x = 10;
function inside(x) {
return x;
}
return inside;
}
result = outside()(20); // returns 20 instead of 10
为什么函数返回20而不是10 为什么我不能用outside(20)而不是outside()(2)调用outdise函数; 为什么()?
答案 0 :(得分:1)
这是一个非常“家庭作业”的问题,但是......
以下内容与您所写的内容完全相同:
var inside = function (x) { return x }
var outside = function () {
var x = 10;
return inside;
}
单步执行函数调用:var result = outside()(20)
,我们发现这与
var result = outside(); // result == inside
result(20); // same as calling inside(20), which returns 20.
答案 1 :(得分:0)
当您引用变量名称时,JavaScript将尝试从最本地范围开始解析引用。在这种情况下:
function outside() {
var x = 10; // This is the second most local
function inside(x) { // The x variable here is the most local
return x; // x will be the most local variable named x, ie the parameter
}
return inside;
}
您将获得传递给inside()
函数的任何内容。现在,如果你有这个:
function outside() {
var x = 10; // This is now the most local
function inside(y) { // Renamed the parameter to y
return x; // returns the variable x
}
return inside;
}
然后你得到10,因为y
参数不再干扰x
函数中的outside()
变量。即使在x
函数通过称为闭包的机制退出后,outside()
的值也会保留。
现在想象你有:
var x = 5; // This is a global variable
function outside() {
var x = 10; // This is the most local
function inside(y) {
return x; // x here will refer to the x with a value of 10
}
return inside;
}
在这种情况下,你也会得到10,因为x
函数中的outside()
变量更多本地而不是全局x
变量。< / p>
至于你的函数调用:
result = outside()(20);
表达式outside()
正在调用函数outside
,它返回对函数inside()
的引用:
return inside; // Inside is a function, we're not calling it because there are no parens
然后你调用你引用的函数(即inside
函数)并传入20的参数值。如果双重禁令令人困惑,你可以这样想:
var foo = outside(); // foo is a reference to a function
result = foo(20); // We're now calling that function, passing in 20 as the parameter
您的inside()
函数返回20
的值,该值设置为变量result
。
答案 2 :(得分:0)
为什么函数返回20而不是10
当存在命名冲突时,内部范围优先。
为什么我不能用outside(20)而不是outside()(2)调用outdise函数;为什么()?
调用outside()
会返回一个函数(如return inner
所示)。然后,您调用该函数。如果您要调用outside(20)
,它仍将返回内部函数。如果你扩展它,可能会更清楚:
var outResult = outside(); // outside returns `inner`, the variable now contains that function
outResult(20); // call the inner function passing the value 20