一、作用域
作用域简单来说就是一个变量的作用范围。
在JS中作用域分成两种:
- 全局作用域
- 函数作用域
全局作用域
- 直接在
script
标签中编写的代码都运行在全局作用域中 - 全局作用域在打开页面时创建,在页面关闭时销毁
- 全局作用域中有一个全局对象
window
,window
对象由浏览器提供- 可以在页面中直接使用,它代表的是整个的浏览器的窗口
- 在全局作用域中创建的变量都会作为
window
对象的属性保存 - 在全局作用域中创建的函数都会作为
window
对象的方法保存
- 在全局作用域中创建的变量和函数可以在页面的任意位置访问
- 尽量不要在全局中创建变量
函数作用域
- 函数作用域在函数执行时创建,在函数执行结束时销毁,每次调用函数都会创建一个新的函数作用域
- 在函数作用域中创建的变量,不能在全局中访问
- 当在函数作用域中使用一个变量时,它会先在自身作用域中寻找
- 如果找到了则直接使用,如果没有找到则到上一级作用域中寻找
二、声明提前
变量的声明提前
- 在全局作用域中,使用
var
关键字声明的变量会在所有的代码执行之前被声明,但是不会赋值 - 所以我们可以在变量声明前使用变量
- 不使用
var
关键字声明的变量不会被声明提前 - 在函数作用域中,也具有该特性
- 使用
var
关键字声明的变量会在函数所有的代码执行前被声明 - 如果没有使用
var
关键字声明变量,则变量会变成全局变量
- 使用
函数的声明提前
- 在全局作用域中,使用函数声明创建的函数(
function fun(){}
),会在所有的代码执行之前被创建 - 也就是我们可以在函数声明前去调用函数
- 使用函数表达式(
var fun = function(){}
)创建的函数没有该特性 - 在函数作用域中,使用函数声明创建的函数,会在所有的函数中的代码执行之前就被创建好