关于闭包和功能范围

时间:2014-01-12 14:14:02

标签: javascript

我正在读一本关于闭包和范围的书的一章。

让我们从两个例子开始(我从书中复制它们)。请考虑以下代码:

var scope = "global space";
function checkscope(){
  var scope ="local scope";
  function f() { return scope; }
  return f();
}
checkscope();

这里我们获取调用checkscope()函数的值是“local scope”。

现在,考虑一下这个功能:

var scope = "global space";
function checkscope(){
  var scope ="local scope";
  function f() { return scope; }
  return f;
}
checkscope()();

看起来很相似,但事实并非如此,我们return f而不是return f() checkscope function checkscope本身最后用两对括号调用不止一对。

你能帮助我理解这两种变化吗?我不明白为什么没有括号调用f函数:它是一个函数,如果你想调用它,你需要使用括号,我想。然后,关于检查镜功能,为什么所有这些括号?

3 个答案:

答案 0 :(得分:2)

  

我不明白为什么没有括号调用f函数:它是一个函数,如果你想调用它,你需要使用括号,我想。然后,关于检查镜功能,为什么所有这些括号?

没有括号的。在JavaScript中,函数是一等值,您只需引用它们并将它们作为对象返回,而无需调用它们。这就是这里发生的事情。调用checkscope会返回一个函数,然后您必须调用该函数才能访问scope

var ref_to_f = checkscope(); // the function f() { return scope; }
ref_to_f(); // "local scope"

这实际上使闭包变得有趣 - 你可以调用一个可以访问与你(调用者)不同的范围的函数。

答案 1 :(得分:0)

checkscope的变体中,您会看到:

return f;

返回实际的函数对象;它不是在调用函数。在JavaScript中,函数就像任何其他对象一样,就像字符串一样。

如果您将此代码粘贴到控制台中,并输入checkscope(),则会看到function f() { return scope; }的返回值。看,它正在返回实际的函数对象,因为它没有被调用(使用())。

那么,当你执行checkscope()()时,你正在调用checkscope()(它返回一个函数),然后调用它返回的另一个()函数。

答案 2 :(得分:0)

在第一个示例中,checkscope返回函数f的结果,而在第二个示例中,它返回对函数f的引用,然后在全局范围内调用{{1} (注意第二个括号括号)。