作用域
在JS中作用域表现为当前的执行上下文,变量和表达式可被访问的范围。
JavaScript 中的作用域可以分为全局作用域和局部作用域(函数作用域与块级作用域)。
全局变量:变量在函数外声明时会被放入全局作用域中,实际上就是放入了全局对象中。于是我们可以在全局通过全局对象访问这个变量。
const name = 'Tom'
const foo = () => {
console.log(name)
}
foo()
全局作用域: JS引擎在解析代码时会在堆内存创建一个全局对象:Global Object(简称GO)。这是全局作用域,在浏览器端为window对象,在node环境为global对象。
全局对象里面会包含一些全局的方法和类,像Math、Date、String、Array、setTimeout等等。- 全局对象是非常重要的,平时之所以能够使用这些全局方法和类,都是在这个全局对象中获取的。
变量提升
JavaScript 在执行任何代码段之前,将函数声明和变量声明放入内存中的优点之一是,你可以在声明一个函数或变量之前使用该函数或变量。
先调用后声明:这在js中是支持的,但是不推荐这么写,推荐使用正常的先声明后调用的方式。
catName("Chloe");
function catName(name) {
console.log("我的猫名叫 " + name);
}
只有声明这个动作被提升了而已
JavaScript 只会提升声明,不会提升其初始化。如果一个变量先被使用再被声明和赋值的话,使用时的值是 undefined, 赋值这个过程不会被提升。这个是最容易出错的地方!
console.log(num); // undefined
var num;
num = 1; // 赋值 这个过程不会被提升
注意:函数声明和变量声明相比,会被优先提升。这意味着函数会被提升到更靠前的位置。