let a=1//报错,预编译时,funciton a函数提升,a已被声明,此处再let声明报错
function a(){
console.log(a)
}
let a = 10;
function fn(){
a = 20;
console.log(a);
}
fn();//20
console.log(a);//20
let a = 10;
function fn(){
let a = 20;
console.log(a);
}
fn();//20
console.log(a);//10
let a = 10;
//因为fn()预编译 且局部变量a提升 a=undefined 往下执行a=20 a=30 打印的a是30
function fn(){
a = 20;//此处找到的a是函数内部的局部变量a 对函数外部的a没影响
var a = 30;//变量提升 此时a已经预编译
console.log(a);
}
fn();//30
console.log(a);//10
let a = 10;
function fn(a){
a = 20;
console.log(a);
}
fn();//20 没传实参 a=undefined 此处即使传了实参a,let a的值也不会改变,仍是10
console.log(a);//10
let a = 10;
function fn(a){
console.log(a);//10
a = 20;//修改形参的值
console.log(a);//20
}
fn(a);
console.log(a);//10
/* 1.在函数作用域空间寻找变量a
/* 2.当函数声明和变量声明同时存在时 函数声明优先于变量声明
3.非匿名立即执行函数,函数变量是只读的,不能进行赋值
*/
let a = 10;//此处分号不能少
(function a(){
a=20//此处的函数变量a 无法赋值 忽略执行不报错,但严格模式下会报错
console.log(a)//输出函数a()本身
})()
let f3= ()=>console.log(this)
f3()//this是window
let o1 ={
f3,//执行到此处 f3引用地址和上面定义的f3地址相同,都指向同一个函数对象,即()=>console.log(this)
test(){
//此处的f3是上面定义的let f3,此处变量f3引用的地址改变了,指向了一个新的函数对象,即()=>console.log('hh')
//f3不在o1对象内部找f3 而是找外部的let f3 因为o1对象内部不算一个函数作用域
f3 = ()=>console.log('hh')
f3()
}
}
o1.test()//hh
f3()//hh
o1.f3()//this是window
【JS】函数作用域、函数提升综合练习
于 2022-01-08 13:11:21 首次发布