作用域
// 全局变量、全局作用域
var a = 'apple'
function fn(){
// 局部变量、局部作用域
var a = "orange"
console.log(a) // orange
}
fn()
console.log(a) // apple
作用域链
只能从里向外查找 最终找到全局 不能同级或者向下查找
var a = "apple"
var b = "orange"
function fn(){
var a = 'banan'
// 此时内部定义了a 输出的是函数内部的a
console.log(a) // banan
// 函数内部没有定义 b 根据作用域链 向上查找 b = orange
console.log(b) // orange
}
fn()
// 函数内部的 a 使用了var定义 所以并不影响全局的变量 a
console.log(a) // apple
变量声明提升
var a = "apple"
function fn(){
// 声明提升
console.log(a) // undefined
var a = 'orange'
console.log(a) // orange
// =====================================
// 变量声明提升了 代码按照以下格式执行
var a;
console.log(a)
a = 'orange'
console.log(a)
}
fn()
函数声明提升
函数的提升会比变量 更加靠前
var a = "apple"
function fn(){
// 声明提升
console.log(a) // undefined
var a = 'orange'
console.log(fns()) // orange
function fns(){
return a
}
}
fn()
// ========================
// 函数和变量发生了声明提升 代码就相当于是按照下列方式执行
var a = "apple"
function fn(){
// 函数声明也会提升
function fns(){
return a
}
var a;
console.log(a) // undefined
a = 'orange'
console.log(fns()) // orange
}
fn()
小练习
var b = 'boy'
console.log(b) // boy
function fighting(){
console.log(a) // undefined
console.log(c) // undefined
// 此时 a 只被定义 但是没有赋值 所以之前的a = undefined
if(a==='apple'){
a = 'Alice'
}else {
a = 'Ada'
}
// a = 'Ada'
console.log(a) // Ada
var a = 'Andy'
middle();
function middle(){
// 此时变量和函数声明提升
// var c; 但是c没有赋值 为定义的值进行运行 会得到NaN
console.log(c++) // NaN
// 此时c已经赋值 c = 100
var c = 100
console.log(++c) // 101
small()
function small(){
// 通过作用域链 向上查找到 a = Andy
console.log(a) // Andy
}
}
// var c
// c = 88
// a = 88
var c = a = 88
function bottom(){
// this指向全局
console.log(this.b) // boy
// 没有使用变量声明 所以是直接修改了全局变量下的值
// 全局下的b = boy 此时修改了 b = baby 并且会影响全局的b的值
b = 'baby'
console.log(b) // baby
}
bottom()
}
fighting()
console.log(b) // baby
本文深入探讨了JavaScript中的作用域规则,包括全局作用域和局部作用域,阐述了作用域链的概念以及如何从内向外查找变量。同时,详细讲解了变量声明提升和函数声明提升的现象,通过实例解析了代码执行的顺序。最后,通过一个小练习巩固了这些概念的应用。
1277

被折叠的 条评论
为什么被折叠?



