关于let 和 var

let userName = 'John';

function showMessage() {
  let message = 'Hello, ' + userName;
  alert(message);
}

showMessage(); // Hello, John

问下各位大神,这里的 userName 是在最外层用let 定义的,但在showMessage()函数内却可以访问。
在这里跟用var 定义的就没有区别了是吗?

另外,试了下window.userName却无法访问。。。

谢谢~

阅读 2.8k
6 个回答

可以了解下作用域和作用域链,当自身作用域找不到相关变量时,会向上级作用域寻找,直到顶级作用域(浏览器环境下是window)。

在非严格模式下,声明的全局变量和函数均自动成为 window 对象的成员

浏览器的顶层对象是window;只有var和function是全局变量
let const 这些不属于顶层对象的属性,所以不能访问;
至于userName可以访问没毛病;let:块级作用域;
详细介绍可以在网上找找;

userName在函数内可以访问是因为作用域, 当前作用域找不到会向上查找;
这里let和var的区别在于, var定义的全局变量会作为顶级对象的属性(浏览器是window, Node是Global), 而let不会;
let和var的区别是 let是块级作用域, 而var是函数作用域, var会有变量提升

image.png

let、const 声明的是块级作用域,只能被块级里面的访问。
var 是没有块级的概念的,他是作用域上声明,非严格模式下全局变量和函数会成为 window 对象的成员

作用域不一样,var是函数作用域,而let是块作用域,也就是说,在函数内声明了var,整个函数内都是有效的,而let由于是块作用域,所以如果在块作用域内定义的变量,在其外面是不可被访问的。
浏览器的顶层对象是window。
ES6中,var function 声明的全局变量依然是顶层对象的属性;let const class import 声明的全局变量不属于顶层对象的属性。
ES6非严格模式下,与var声明的全局变量都会成为window的属性;而使用let声明的全局变量,不会成为window的属性

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题