2017-02-24 54 views
9

在JavaScript中,声明函数中的变量,为什么函数获得更高的优先级?

function bar() { 
 
     return foo; 
 
     foo = 10; 
 
     function foo() {} 
 
     var foo = 11; 
 
    } 
 
    console.log(typeof bar());

的typeof酒吧回报功能? 为什么不能编号?

+1

该代码是一个烂摊子......我不知道你想achiev。它返回函数的原因是,因为你正在返回空的foo()函数而没有任何返回值。 **算法连续工作,但函数没有连续声明**。 –

+3

记住1规则,js编译器在顶部的上下文中移动函数声明。该键解决所有查询 –

回答

4

JS功能在两遍三次通过执行。首先,引擎遍历代码,查找函数声明并提升它们(=将它们移动到顶部),其次,它提升变量声明(除非已经有相同的名称),最后它运行“规范化”代码。

在您的代码片段中,引擎选择function foo并将其移动到该函数的顶部。后续的var foo被忽略。

这将导致在下面的 “正常化” 代码:

function bar() { 
    function foo() {} 
    return foo; 
    foo = 10; 
    foo = 11; 
} 

这就解释了你的结果。

参考:Declaration Binding Instantiation,请注意步骤5和8。

+1

为什么'function bar(){ 返回foo; foo = 10; foo = function foo(){} var foo = 11; } 的console.log(typeof运算巴());''登录undefined'? – guest271314

+0

@ guest271314:谢谢,我添加了“声明”一词:function _declarations_首先被挂起。你的定义只是一个普通的价值。 – georg

+0

'不能决定foo是全局还是本地',如果它不是本地的,那么它会使它成为全局的? –

3

return foofunction foo() {}只是引用,这样它的返回Function

function bar() { 
    return foo; // function foo() {} 
    foo = 10; 
    function foo() {} 
    var foo = 11; 
} 
alert(typeof bar()); // function 

另一个场景

function bar() { 
    return foo; // returns foo undefined as no value is assigned  
    foo = 10;   
    var foo = function() {} // referenced to variable 
    var foo = 11;  
} 

alert(typeof bar()) // undefined 

在这里它将返回数

function bar() { 
    foo = 10; 
    return foo; // 10 
    function foo() {} 
    var foo = 11; 
} 
alert(typeof bar()); // number 10 

这也将返回它返回一个闭合功能号码

function bar() { 
    foo = 10; 
    return function() { 
     return foo 
    } 
    var foo = 11; 
} 
alert(typeof bar()()); // number 10 
2

你搞砸了回报:)。

这不是关于优先级。这是关于你最后从函数返回的东西。改变他们,看看。你得到号码。

function bar() { 

    function foo() {} 
    var foo = 11; 
     return foo; 
    foo = 10; 
} 
alert(typeof bar()); 

This gives you number.

+0

要在此展开,我想你也触犯运行某些[吊装]的(https://developer.mozilla.org/en-US/docs/Glossary/Hoisting)是复杂的问题... –

1

其原因行为是由于在JavaScript吊装。

当JavaScript解释,任何变量定义,首先处理,所以在您的函数的范围,呼叫的实际顺序是像这样

function bar { 
    var foo = 11; 
    function foo() {} 
    return foo; 
} 

的吊装位置var foo = 11声明首先,然后foo被foo命名的函数覆盖。因此return foo返回函数本身,而不是数值。

This is a good starting point to understand hoisting

+1

我认为你大部分都是正确的,但变量_declaration_被吊起来了,但是__不是赋值。这是'typeof function'赢得胜利的真正原因。 –

+0

我不认为这是正确的,'var foo'根本没有处理。 – georg

+0

好的,我明白了......但你认为它应该是:var foo; (){} return foo; foo = 11; –

0

功能被提升到当前作用域的顶部,因此,要在执行时的代码将看起来像

function bar() { 
    var foo; 
    function foo() {} 
    return foo; 
    foo = 10; 
    function foo() {} 
    foo = 11; 
} 
console.log(typeof bar()); 
1

return声明防止编号分配执行,但函数声明并不关心。

function bar() { 
    return foo; 
    foo = 10;   //assignment is never executed 
    function foo() {} //function definition happens even if code is not executed 
    var foo = 11;  //assignment is never executed 
    } 
console.log(typeof bar()); 

为了验证这一点,注释掉function foo() {}线。您会看到bar()返回undefined。赋值语句定义,即使不执行的语句foo,但直到它们被执行(因此留在原位的功能定义),他们不揍的foo值。

拨弄代码:
https://jsfiddle.net/vwm31faq

相关问题