我正在读一本书中关于闭包和范围界定的章节。
让我们从两个例子开始(我从这本书中复制它们)。考虑以下代码:
var scope = "global space";
function checkscope(){
var scope ="local scope";
function f() { return scope; }
return f();
}
checkscope();
在这里,我们获得调用checkscope()函数的值是“本地作用域”。
现在,考虑一下这个函数:
var scope = "global space";
function checkscope(){
var scope ="local scope";
function f() { return scope; }
return f;
}
checkscope()();
这看起来很相似,但事实并非如此,我们在checkscope function
中使用的是return f()
而不是return f()
,而checkscope
本身是用两对括号而不是一对一对圆括号来调用的。
你能帮我理解这两种变体吗?我不明白为什么不带括号地调用f函数:它是一个函数,如果要调用它,就需要使用括号,我猜。那么,关于校验作用域函数,为什么会出现这些括号呢?
发布于 2014-01-12 06:19:32
我不明白为什么不带括号地调用f函数:它是一个函数,如果要调用它,就需要使用括号,我猜。那么,关于校验作用域函数,为什么会出现这些括号呢?
它不是不带括号的。在JavaScript中,函数是一流的值,您只需引用它们并将它们作为对象返回,而不需要调用它们。这就是这里发生的事。调用checkscope
确实返回一个函数,然后您必须调用该函数来访问scope
var ref_to_f = checkscope(); // the function f() { return scope; }
ref_to_f(); // "local scope"
这实际上使闭包变得有趣--您可以调用一个可以访问与调用者不同的作用域的函数。
发布于 2014-01-12 06:18:05
在checkscope
的变体中,您可以看到以下内容:
return f;
它正在返回实际的函数对象;它没有调用该函数。在JavaScript中,函数和任何其他对象一样都是对象,就像字符串一样。
如果将此代码粘贴到控制台并键入checkscope()
,您将看到function f() { return scope; }
的返回值。看,它正在返回实际的函数对象,因为它没有被调用(使用()
)。
因此,当您执行checkscope()()
时,您调用checkscope()
(它返回一个函数),然后调用它与另一个()
一起返回的函数。
发布于 2014-01-12 06:18:52
在第一个示例中,checkscope
返回函数f
的结果,而在第二个示例中,它返回对函数f
的引用,然后在全局作用域中调用该函数:checkscope()();
(注意第二个括号的对齐)。
https://stackoverflow.com/questions/21075651
复制