JavaScript基础
作用域
- 是什么,作用与分类
/*
js作用域:就是变量在某个范围内起作用/有效,目的是为了提高代码的可靠性,更重要的是减少命名冲突
作用域分类:es6之前,只分为全局作用域和局部作用域
*/
- 全局作用域与局部作用域
/*
1. 全局作用域:整个script标签或者一个单独的js文件
//---- 全局作用域
2. 局部作用域:函数内部就是局部作用域
function f1() {
//----局部作用域
}
*/
- 全局变量与局部变量
// 变量作用域:根据作用域的不同,我们变量分为全局变量和局部变量
- 全局变量:在全局作用域下声明的变量,在全局都可以使用
var num = 1
console.log(num)
function f1() {
console.log(num)
}
console.log(num)
// 这种情况下num是全局作用域
function f1() {
num1 = 1
console.log(num1)
}
f1()
console.log(num1)
// 在函数内部不使用var声明直接赋值的变量,在函数调用之后就会变成全局变量(不推荐使用)
- 局部变量:在函数内部可以使用
function f2(){
let num2=1
console.log(num2)
}
// num2只能在f2函数内部才能使用,是局部变量
/*
从执行效率来看:
1. 全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
2. 局部变量 当我们程序执行完毕就会销毁,比较节约内存资源
*/
作用域链
//作用域链:内部函数访问外部函数的变量,采用的是链式查找的方式来决定取那个值,这种结构我们称作作用域链
function f1() {
var a = 1
function f2() {
console.log(a)//此处首先在f2{}里面查找变量a,找不到在往其外部函数f1{}里面找变量a
}
f2()
}
f1()
预解析
/*
1. js引擎运行js分为两步:预解析和代码执行
(1)预解析:js引擎会把js里面所有的var还有function提升到当前作用域的最前面
(2)代码执行:按照代码的书写顺序从上到下执行
2. 预解析分为变量预解析(变量提升)和函数预解析(函数提升)
(1)变量提升:就是把所以的变量声明提升到当前作用域最前面,只提升不赋值
(2)函数提升:就是把所以的函数声明提升到当前作用域的最前面,不调用函数
*/
//案例1
console.log(a) //undefined
var a = 10
console.log(a) //10
// 相当于
var a;
console.log(a)
a = 10
console.log(a)
// 案例2
f1()
function f1() {
console.log(1)
}
// 相当于
function f1() {
console.log(1)
}
f1()