2016-07-24 45 views
0

在本例中,我知道它将打印undefinedJavascript:函数提升

var bar = typeof foo; 
var foo = function() { 
    console.log('abcd'); 
} 
foo(); 
console.log(bar); // -> undefined 

所以我的理解是,当变量悬挂,bar仍高于foo,但foo得到执行,所以不应该解释知道什么foo是什么?

注:我试图了解解释器是如何工作的。我的问题不在于如何解决上述问题。

+3

当'bar'被赋予'typeof foo'的值时'foo'没有被执行。在提升时,'foo'的值是未定义的。 –

+0

通常,最好忘记吊装存在。只有知道你的函数是否妨碍了可读性,并且你想最后声明它们,但是你必须使用一个命名的函数表达式来声明它们才是真正有用的。 – 4castle

回答

5

如果你占了变量定义提升,你的代码是相同的:

var bar; 
var foo; 

// foo does not yet have a value, so it it's still undefined 
bar = typeof foo; 

// foo gets a value here 
foo = function() { 
    console.log('abcd'); 
} 

// since foo got a value in the previous statement, you can now execute it here 
foo(); 
console.log(bar); 

只有变量定义本身悬挂,而不是分配。

所以,你可以从这个排序看到,当你执行bar = typeof foofoo还没有一个值,从而分配给undefinedbar。如


功能定义:

function foo() { 
    console.log('abcd'); 
} 

也悬挂,所以如果你定义foo这样,那么这将是一个不同的故事。但是您使用的功能分配本身并不是本身。您定义foo的方式,它只是一个像任何其他变量一样的变量。

+0

但是,正如你所说的,foo得到的是第二个变量赋值的值,在最后一行调用'bar'时,解释器不应该知道foo是什么吗? – AlanH

+1

@AlanH - “bar”包含任何“foo”在作业时的副本。您可以将'foo'改为您的心脏内容,'bar'不会改变。这就像'var y = 1; var x = y; y = 2;''x'的值不会因为你赋值给'y'而改变。 'x'具有原来在'y'中的任何副本。 – jfriend00

+0

@AlanH - 从当天早些时候看到这个答案:http://stackoverflow.com/questions/38538330/when-command-line-order-matters/38538444#38538444 – jfriend00