2016-12-01 77 views
-2

是否有人可以解释如下的代码?我感到困惑的 return f();关闭和返回值

  1. 作用是否return f();调用方法f并返回结果? (即返回f

  2. return f();是否返回一个对象?

如果我改变return f();只是f();然后checkscope = undefined

var scope = "global scope";   // A global variable 
function checkscope() { 
    var scope = "local scope";  // A local variable 
    function f() { return scope; } // Return the value in scope here 
    return f(); 
} 
checkscope()       // => "local scope" 
+1

1)是2)否,它返回一个字符串3)如果你删除'return',那么'checkscope'不会返回任何东西,因此你会得到'undefined'。 – vlaz

+0

可能的重复[JavaScript关闭如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – vlaz

+1

F返回到它所说的。这里的重点是显示ES5范围,例如,只有函数范围。 –

回答

3
  1. 是。 return返回无论RHS上的表达式解析为
  2. 您可以看到f返回的内容:return scope;scope在前一行中分配。它是一个字符串。

如果我改变返回f();只是f(); checkscope =未定义

嗯,是。如果你没有一个return声明一个函数,它返回undefined

+0

好的谢谢,只是为了澄清 - 返回f()调用方法f();方法f返回var范围的值(给调用者)。最后返回字符串'global scope' – stckpete

+0

@stckpete:Yup。但这是一种功能,而不是一种方法。 –

1

为#1。 return f()调用f,然后返回什么f回报。 f是对checkscope调用的关闭,这意味着它可以在该调用的上下文中访问scope,因此f会读取当前值scope,即"local scope"(字符串),并返回该值。

return f();是否返回一个对象?

不,一个字符串(见上文)。

如果我改变return f();只是f();然后checkscope = undefined

这是因为,当你调用一个不带return <value>声明终止函数,调用它的结果是价值undefined。通过删除return,可以删除返回值checkscope


下面是一个更有趣的版本:

function memo(value) { 
    function f() { return "value is '" + value + "'"; } 
    return f; // Note! No(), not calling it, returning the function 
} 
var f1 = memo("hi"); 
var f2 = memo("there"); 
f1(); // "value is 'hi'" 
f2(); // "value is 'there'" 

这需要它更进了一步,允许f(关闭)存在超越呼叫memo,这使的该内文的结尾具体调用memo alive,这意味着我们可以使用特定于该上下文的value