有关Javascript提起的问题
当我阅读关于Javascript提起的问题时,我尝试了以下内容。 我不知道为什么第一个和第二个输出不同。 提前致谢。 (我甚至不确定这与吊装有关。)
var me = 1; function findme(){ if(me){ console.log( me );//output 1 } console.log( me ); //output 1 } findme();
但以下输出未定义。
var me = 1; function findme(){ if(me){ var me = 100; console.log(me); } console.log(me); } findme(); // undefined
variables声明被提升到每个函数的顶部,但是赋值仍然保持在原来的位置。 所以第二个例子是这样运行的:
var me = 1; function findme () { var me; // (typeof me === 'undefined') evaluates to true if (me) { // evaluates to false, doesn't get executed me = 100; console.log(me); } console.log(me); } findme();
第二个例子中的if
块中的局部variables的声明被提升为整个函数。
因此, me
在函数中总是指局部variables,而不是全局variables。
但是,variables的值没有被提升,所以它总是undefined
并且从不input。
一个var
升级不会提升任务,只是声明。 所以它被这样parsing:
function findme(){ var me; if(me){ me = 100; console.log(me); } console.log(me); }
当if
语句运行时, me
在函数的本地被decalred,但undefined
(没有值)。 undefined
是虚假的,所以你的条件从来都不是真的。
这就是为什么总是在函数的顶部声明局部variables的习惯,因为如果你喜欢它,那么它就是它的前进方向。
我觉得这个问题的真正答案经常被“提升”一词所抽象。 这是真正发生的事情。
每次在JavaScript中运行一个函数时,都会为该函数创build一个新的执行上下文,该上下文被推入执行堆栈。 所以在你的第二个例子中你有下面的代码:
var me = 1; function findme(){ if(me){ var me = 100; console.log(me); } console.log(me); } findme(); // undefined
在这个代码执行的最初阶段(假设这是整个JavaScript),首先要做的是JavaScript引擎创build一个全局执行上下文。 在创build过程中,它将为该上下文中的所有函数和variables分配内存。 函数按您想象的方式进行分配和初始化,但variables只能先分配(未正确初始化)。
因此,在本例中创build全局执行上下文之后,函数findme()将被全部分配在内存中,但variables“me”将被分配一个初始值undefined。 在创build全局执行上下文之后,代码将被运行。 它发现var me = 1; 并将“me”variables从undefined更新为1.它确实对函数定义没有任何作用,但是它find了一个函数调用“findme();”。
在这一点上,我们inputfindme()函数。 真的,同样的事情又一次发生了。 为这个函数创build一个执行上下文,这个执行上下文被压入全局执行堆栈,并成为运行代码。 如果你理解我的讨论的第一部分,我想你会意识到“console.log(me);” 在“if”语句未定义之后调用。 为什么? 因为当findme()函数执行上下文被创build时,它最初创build了“me”variables,因为它在上下文中看到“var me = 100;” 声明。 但是,“if”语句在全局执行堆栈方面没有得到专用的执行上下文。 于是,当“console.log(me);” 在if的外部运行在函数的总体上下文中定义的mevariablesIS。 但是你试图访问一个variables的范围之外。
如果你遵循了这一切,现在你已经理解了JavaScript引擎如何工作的一个主要部分。