2016-08-14 156 views
0
function foo(a) 
{ 

    var b = a*2; 
    function bar(c) 
    { 

    console.log(a,b,c); 
    var c= 3; 
    } 
    bar(4); 
    var c= 4; 
    var a= 2; 
} 

foo(1); 

为什么c不是3?尽管var c = 3,但在bar()的词汇范围中定义,为什么即使在bar()调用下定义var c = 4,也会选择var c = 4? 请帮我理解如何挑选这些值并将其分配给变量。变量的查找范围

+0

使用[this search](/ search?q =%5Bjs%5D + variable + hoisting)可以找到关于此主题的很多问题和答案,例如[this one](http://stackoverflow.com/questions)/33540709/javascript-variable-hoisting)和其他人的**群**,包括我刚标记的复制目标(在这种情况下,它是全局的,但答案是相同的)。 –

回答

0
  1. c在执行赋值之前不会变为3,即在日志输出之后。

  2. var c不会在这里宣布一个新的变量,因为你已经有c作为参数的函数(但你是正确的,如果它这样做了,声明将被“悬挂” ---那就是术语你想寻找在这里得到好的答案)。


为什么即使它被定义的栏下方VAR C = 4被拾取()调用?

它不是“挑选”。在你的函数中你看到4,因为c是函数参数,你可以把它叫做bar(4)

来自外部函数的c正在被内部函数中的另一个c的本地声明遮蔽,并且不可访问。