我正在读一本关于闭包和范围的书的一章。
让我们从两个例子开始(我从书中复制它们)。请考虑以下代码:
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函数:它是一个函数,如果你想调用它,你需要使用括号,我想。然后,关于检查镜功能,为什么所有这些括号?
答案 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} (注意第二个括号括号)。