首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以下代码语句的输出

以下代码语句的输出
EN

Stack Overflow用户
提问于 2014-12-23 06:37:20
回答 3查看 109关注 0票数 0
代码语言:javascript
复制
var abc = function() {
    console.log(1);
}

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

abc();

我希望它能控制2,但不,它会控制1,因为函数和变量hoisting.Anybody想要更清楚地说明这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-23 07:13:22

无功提升

理解JavaScript中的范围如何工作的关键是理解提升的概念。

因为变量声明(和声明一般)是在执行任何代码之前处理的,所以在代码中的任何地方声明变量都等同于在代码顶部声明变量。这也意味着在声明变量之前可以使用它。这种行为称为“提升”,因为变量声明似乎被移动到函数或全局代码的顶部。

代码语言: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引擎就是这样解释它的。

代码语言:javascript
复制
function abc() {
    console.log(2);
}

var abc;

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

abc(); 

参考文献: JavaScript范围和吊装

票数 0
EN

Stack Overflow用户

发布于 2014-12-23 06:52:25

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

  1. 默认情况下,所有作用域都指定名称为Language-defined:和arguments
  2. 形式参数:函数可以有命名的形式参数,这些参数的作用域是该函数的主体
  3. 函数声明:这些是表单函数foo() {}
  4. 变量声明:这些声明采用var foo;形式

参考资料:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

在您的例子中,第一个函数是类型4,第二个函数是类型3。因此,第二个函数被挂起,首先将函数引用分配给abc。然后,第一个函数被悬挂,重新分配对abc的引用。您的代码按以下顺序编译,

代码语言:javascript
复制
function abc() {
    console.log(2);
}

var abc;

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

abc();

请注意,只有声明是悬挂的。作业不悬挂。

代码语言:javascript
复制
var bar = 'test';
var foo = function(){/*foo 1*/};
var foo;
function foo(){/*foo 2*/} 
alert(foo);

将按照这个顺序遵守,

代码语言:javascript
复制
function foo(){/*foo 2*/}  //function declaration
var bar;  //variable declaration
var foo;  //variable declaration
bar = 'test';
foo = function(){/*foo 1*/};
alert(foo);
票数 1
EN

Stack Overflow用户

发布于 2014-12-23 06:44:26

如果您只是问为什么函数abc不是最近声明的函数,那是因为,在Javascript中,函数被悬挂到当前作用域的顶部。

这意味着您的代码被转换成如下所示:

代码语言:javascript
复制
function abc() { console.log(2); }
var abc = function() { console.log(1); }
abc();

这意味着,当需要调用abc时,"active“是记录1的那个。

我在这种行为上找到的最好的文章之一是完全好的那个

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27615266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档