[英]Output of below code statements
var abc = function() {
console.log(1);
}
function abc() {
console.log(2);
}
abc();
我希望它会控制台2,但由于功能和变量提升,它将不会控制台1,任何想让它更清晰的人都可以。
在JavaScript中,名称以四种基本方式之一进入作用域,并且升序遵循以下顺序...
this
和arguments
foo() {}
var foo;
的形式var foo;
参考: http : //www.adequatelygoodgood.com/JavaScript-Scoping-and-Hoisting.html
在您的情况下,第一个函数是类型4 ,第二个函数是类型3 。 因此,首先要提升第二个功能,将功能引用分配给abc
。 然后提升第一个功能,将引用重新分配给abc
。 您的代码按以下顺序编译,
function abc() {
console.log(2);
}
var abc;
abc = function() {
console.log(1);
}
abc();
请注意,仅悬挂声明。 作业不挂起。
var bar = 'test';
var foo = function(){/*foo 1*/};
var foo;
function foo(){/*foo 2*/}
alert(foo);
将按照此顺序进行编译,
function foo(){/*foo 2*/} //function declaration
var bar; //variable declaration
var foo; //variable declaration
bar = 'test';
foo = function(){/*foo 1*/};
alert(foo);
如果您只是问为什么函数abc
尽管最近才被声明,却不是被执行的原因,那是因为在Javascript中,函数被提升到当前作用域的顶部。
这意味着您的代码会变成如下所示的形式:
function abc() { console.log(2); }
var abc = function() { console.log(1); }
abc();
这意味着,当需要调用 abc
,“活动”的是记录1
那个。
关于这种行为我曾经找到的最好的文章之一是足够好 。
理解JavaScript范围的工作原理的关键是理解提升的概念。
因为变量声明(以及一般的声明)是在执行任何代码之前处理的,所以在代码中的任何位置声明变量等同于在顶部声明变量。 这也意味着可以在声明变量之前使用它。 此行为称为“吊装”,因为似乎变量声明移到了函数或全局代码的顶部。
console.log("function hoisting:::: ",abc()); /* log = 2 we are calling the function(hoisting)*/
var abc = function() {
console.log(1);
};
console.log("var:::: ",abc()); /* log = 1*/
function abc() {
console.log(2);
}
abc(); /* log = 1*/
console.log("function:::: ",abc()); /* log = 1*/
因此,在您的情况下,您不调用函数 ,而是将函数记录在顶部。
这就是javascript引擎的解释方式
function abc() {
console.log(2);
}
var abc;
abc = function() {
console.log(1);
};
abc();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.