看书看迷糊了 求解答

2022-04-06 17:08:48 +08:00
 victory

在看《 JavaScript 高级程序设计(第 4 版)》第 3 章第 3 节变量 看迷糊了

  1. var 声明作用域 关键的问题在于,使用 var 操作符定义的变量会成为包含它的函数的局部变量。比如,使用 var 在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁:
function test() { 
 var message = "hi"; // 局部变量
} 
test(); 
console.log(message); // 出错!
}

下面这个代码为什么没有报错啊

if (true) { 
 var name = 'Matt'; 
 console.log(name); // Matt 
} 
console.log(name); // Matt 

这个 name 变量 怎么变成全局变量了

3437 次点击
所在节点    JavaScript
31 条回复
mascteen
2022-04-06 21:22:39 +08:00
换一本书看吧,这本书不符合新手,推荐权威指南
jadehare
2022-04-06 21:30:00 +08:00
es6 建议使用 let 和 const ,不用管啥 var 啥作用域了,你叫一个开发很久习惯使用 let 的人来也得反应一会,这不是正常开发的思路。
Leviathann
2022-04-06 23:00:45 +08:00
es6 都快 10 年了
demo06
2022-04-07 09:00:43 +08:00
@xQmQ if 不是函数语句块,会导致变量作用域提升,所以你在 if(boolean){var xx=x;}所以你能打印成功
demo06
2022-04-07 09:01:50 +08:00
@xQmQ if 不是函数语句块,会导致变量作用域提升,所以你在 if(boolean){var xx=x;}时,var 变量会被提升到文件头部,所以你能打印成功
demo06
2022-04-07 09:26:23 +08:00
@xQmQ 不对我描述的有问题,应该是 javascript 没有块级作用域,变量会被提升
xQmQ
2022-04-07 09:55:24 +08:00
@demo06 var 是没有块级作用域的,所以以下代码在浏览器控制台初次打印时提示 userName 是 undefined ,打印结果是 2.undefined ( userName 被提升了)

if(false){
var userName = 'test';
console.log('1.'+userName);
}
console.log('2.'+userName);

但是如果执行一次 if(true),再执行 if(false) 会打印成功;我这里猜测是因为解释器的原因,userName 被记录了,所以可以打印成功

你提到『 JavaScript 没有块级作用域』,var 没有,let 应该是有的
demo06
2022-04-07 11:07:43 +08:00
@xQmQ 在浏览器和 vs 里分别执行试了下,浏览器会记录,vs 还是 undefind
xQmQ
2022-04-07 12:22:47 +08:00
@demo06 浏览器估计是交互模式,带记录,vs 估计解释器直接执行文件了
ljpCN
2022-04-07 14:31:50 +08:00
关于块作用域楼上解释得差不多了,我给楼主一个建议:别用 var 。用 const 和 let 。
dany813
2022-04-08 12:07:48 +08:00
var 弃用吧,js 各种垃圾语法太多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845287

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX