函数作用域中定义在后面的变量能被前面的表达式访问到吗?

发布于 2022-09-01 07:27:47 字数 193 浏览 16 评论 0

function test(){
    alert(a);
    var a = 10;
}
test();

运行结果是 Undefined 。这与书上写的 “函数中的任何位置定义的变量在该函数中的任何地方都可见(《javascript语言精粹》第36页)” 似乎是矛盾的。想请教各位,我可能在什么地方理解有误。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

素手挽清风 2022-09-08 07:27:47

不矛盾的,JavaScript会加载或者说是解析两次

第一次:解析加载变量声明,函数声明,对函数的参数赋值

第二次:给变量赋值,执行函数

因为js是顺序加载,即从上到下,所以在函数中,的加载顺序是这样的:

// 无变量声明 1
function test(){
             // 参数赋值   2.1 无参数,所以无参数赋值
    var a ;  // 声明变量   2.2 变量声明总会优先于变量赋值,所以就有“变量提示”这一说
             // 无函数声明 2.3
    alert(a);// 执行函数   2.4 a因为没有赋值,所以是undefined
    a = 10;  // 赋值变量   2.5 a现在被赋值了 a = 10
}
test();      // 2 这里挺关键的 分解看是 声明函数表达式 + 执行函数 ==> test + ()
             // 在声明的时候会跳到函数表达式声明的地方

总结:

  1. 不要在变量赋值之前使用,除非你想用其默认值
  2. 函数声明在哪里(执行位置的前后)都可以
想念有你 2022-09-08 07:27:47

变量提升(hoist),这段代码相当于:

function test() {
    var a;
    alert(a);  // undefined
    a = 10;
}
留一抹残留的笑 2022-09-08 07:27:47

这段代码在c语言中是不能运行的,因为a变量未定义啊,但javascript中可以啊,a定义了,只是没赋值。
你把下面var a = 10;注释掉 就看出区别来了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文