输出以下代码语句

时间:2014-12-23 06:37:20

标签: javascript

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

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

abc();

我期待它会控制台2,但不会因为它而控制台1    功能和变量提升。任何想要更清楚的人。

3 个答案:

答案 0 :(得分:1)

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

  1. 语言定义:默认情况下,所有范围都是名称thisarguments
  2. 形式参数:函数可以具有命名形式参数,其范围限定为该函数的主体
  3. 函数声明:它们的格式为函数foo() {}
  4. 变量声明:其格式为var foo;
  5. 参考:http://www.adequatelygood.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);
    

答案 1 :(得分:0)

如果你只是问为什么函数abc不是被执行的那个,尽管它最近被声明,那是因为,在Javascript中,函数被提升到当前范围的顶部。

这意味着您的代码将变为如下所示:

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

这意味着,当调用 abc时,“有效”的是记录1的那个。

我在这种行为中找到的最好的文章之一是the one over at adequately good

答案 2 :(得分:0)

var hoisting

理解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 Scoping and Hoisting