繁体   English   中英

以下代码语句的输出

[英]Output of below code statements

var abc = function() {
    console.log(1);
}

function abc() {
    console.log(2);
}

abc();

我希望它会控制台2,但由于功能和变量提升,它将不会控制台1,任何想让它更清晰的人都可以。

在JavaScript中,名称以四种基本方式之一进入作用域,并且升序遵循以下顺序...

  1. 语言定义的 :所有的作用域是,默认情况下,给出的名字thisarguments
  2. 形式参数 :函数可以具有命名形式参数,范围限于该函数的主体
  3. 函数声明 :形式为函数foo() {}
  4. 变量声明 :这些声明采用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(); 

REF:JavaScript范围和吊装

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM