在javascript中命名冲突和闭包

时间:2013-07-22 20:01:38

标签: javascript

我有这段代码:

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函数; 为什么()?

3 个答案:

答案 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