var abc = function() {
console.log(1);
}
function abc() {
console.log(2);
}
abc();
我期待它会控制台2,但不会因为它而控制台1 功能和变量提升。任何想要更清楚的人。
答案 0 :(得分:1)
在JavaScript中,名称以四种基本方式之一进入范围,并且提升顺序遵循以下顺序...
this
和arguments
foo() {}
var foo;
参考: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)
理解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();