首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript‘提升’

JavaScript‘提升’
EN

Stack Overflow用户
提问于 2013-03-09 21:22:15
回答 5查看 10.5K关注 0票数 86

我偶然发现了JavaScript‘提升’,我不知道这段代码到底是如何工作的:

代码语言:javascript
运行
复制
var a = 1;

function b() {
    a = 10;
    return;

    function a() {}
}

b();
alert(a);

我知道像( function a() {} )这样的函数声明将被提升到函数b作用域的顶部,但它不应该覆盖a的值(因为函数声明覆盖了变量声明,而不是变量初始化),所以我预计警报的值应该是10而不是1!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-09 21:26:06

全局代码设置为1

  • b() is called

  • function a() {}被提升并创建一个屏蔽全局a

  • The的局部变量本地a设置为a (覆盖函数a)

  • The

  • a(
  1. a) is a

<

  1. >G222a>
票数 115
EN

Stack Overflow用户

发布于 2013-03-09 21:35:05

这是因为本例中编译/解释的顺序有些误导。在执行函数的其余部分之前,会先解释function a () {}行,因此在函数的开头,a的值为function a () {}。当您将其重新分配给10时,您将在函数b()的局部作用域中重新分配a的值,返回后将丢弃该值,而将a = 1的原始值保留在全局作用域中。

您可以通过将alert()等放在适当的位置来验证这一点,以查看a在各个点的值是什么。

票数 6
EN

Stack Overflow用户

发布于 2013-03-10 00:40:12

(1) JavaScript没有block语句作用域;相反,它是块所在代码的本地作用域。(2) Javascript在函数作用域中声明变量,这意味着在函数中声明的变量在该函数中的任何地方都可用,甚至在它们被赋值之前。

(3)在函数体中,局部变量优先于同名的全局变量。如果您声明了一个与全局变量同名的局部变量或函数参数,则将有效地隐藏全局变量

你的代码与:(阅读评论)

代码语言:javascript
运行
复制
<script>
var a = 1;          //global a = 1
function b() {
    a = 10;         
    var a = 20;     //local a = 20
}
b();
alert(a);           //global a  = 1
</script>

参考资料:

(1)

(2)

(3)

所以在你的代码中:

代码语言:javascript
运行
复制
var a = 1;          //global a = 1  
function b() {
    a = 10;         
    return;
    function a() {} //local 
}
b();
alert(a);           //global a = 1  
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15311158

复制
相关文章

相似问题

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