全局作用域:全局变量
顶级作用域:一级作用域
<script>
//顶级作用域(父作用域)
var x = "" //全局变量
function fn(){
//局部作用域:二级作用域(子作用域)
var a = 123;//局部变量
function aa(){
//局部作用域:三级作用域(子作用域)
}
}
</script>
子作用域可以获取父级作用域的全部代码段
父作用域无法读取子作用域的代码段
var x = "111"
function fn(){
//局部作用域
//x 自由变量:当前自身所处作用域中,不存在的变量(逐级寻找)
console.log(x)//结果为undefined
var x = "23424"//就近原则,程序从上往下运行,变量提升
}
fn()
常见的作用域场景
全局作用域
局部作用域(es5)/块级作用域(es6)
if(true){
let aa = "xxx"
}
console.log(aa)//报错
//let 声明的变量只在 let 命令所在的代码块 {} 内有效,在 {} 之外不能访问
if(true){
var aa = "xxx"
}
console.log(aa)//运行结果xxx
var与let声明变量
var:1、定义变量支持重复定义
2、导致变量提升
3、不支持块级作用域
let:1、变量无法重复定义
2、阻止变量提升
3、支持块级作用域
const声明常量(一般用大驼峰命名)
//也用于存储数据,一旦赋值值不允许发生变更
//声明一个只读的常量,一旦声明,常量的值就不能改变
静态作用域:
变量的解构赋值:
var [a,b,c] = [val,val2,val3]
var {age,sex,admin} = {userName:"admin",sex:"女",age:"22"}
import {http,response,request} form "http"
var str="qwertyuioasdfghjklxcvbn"
var arr=[...str]
console.log(arr)//26字母a-z快速生成
var arr = ["meme","text"]
let obj = {userName:"admin",sex:"女"}
//var [a,b,c] = arr
var [a,b,c] = [...arr]//把arr里的值循环遍历出来赋给a,b,c
console.log(a,b,c)//meme text undefined
var {userName,sex} = obj//变量名需要与原对象的一致
console.log(userName,sex)//admin 女
//交换变量的值
var a = 10
var b = 20
var [b,a] = [a,b]
console.log(a,b)
运算符 ...(扩展运算符)
快速展开一个可迭代(遍历)的数据结构
string
arr = [] //数组
obj = {} //对象
set = new Set()
var str="qwertyuioasdfghjklxcvbn"
var arr=[...str]
console.log(arr)//26字母a-z快速生成
作用域链scope chain
用来描述作用域与子作用域之间的关系
函数提升
/声明式的自定义函数会提升
//提升(将声明函数提升至当前作用域的最顶端)
//字面量
var a = function(){
console.log("11")//打印出来11
}
a()
-------------------------------
a()
var a = function(){
console.log("11")//打印报错
}