JavaScript闭包

本文深入探讨JavaScript中的变量提升现象,解释了为何在声明前使用变量会得到undefined,并对比了函数声明与函数表达式的差异。同时,文章详细解析了闭包的两种常见情景及其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码运行时代码声明和函数会被提前(即变量提升)

console.log(a)//undefined
var a = 200

上面的代码打印结果是undefined,原因是上面的代码等同于下面的写法

var a = undefined
console.log(a)//undefined
a = 200

同理这种写法

//函数声明  这种写法在 声明前后调用都可以
function fun(){}
//函数表达式 这种写法 只能在 声明后调用都可以
var fun1 = function(){}

相当于

var fun1 = undefined
//函数声明  这种写法在 声明前后调用都可以
function fun(){}
//函数表达式 这种写法 只能在 声明后调用都可以
fun1 = function(){}

因此在 var fun1前调用 fun1()时会报错
以下代码运行结果同理

console.log(a)// undefined
var a = 200

fun('zheng')
function fun(name){
    age = 20
    console.log(name,age)//zheng 20
    var age
}

//上面的代码相当于下面的代码
var a = undefined //变量a提前
function fun(name){// fun提前
    var age = undefined//age提前
    age = 20
    console.log(name,age)//zheng 20
}

console.log(a)// undefined
a = 200

fun('zheng')

this在执行时才能确定,定义时无法确定

var a = {
    name:'B',
    fn:function(){
        console.log(this.name)
    }
}
a.fn() // B
a.fn.call({name:'C'}) // C
var fn1 = a.fn 
fn1()// undefined

this在普通函数中指向window

function fun(){
    console.log(this===window)
}
fun()

作用域

js没有块级作用域只有全局作用域和函数作用域

if (true) {
    var hasData = true
}
console.log(hasData)//true

var num = 100
function fun(){
    var num2 = 200
    console.log(num)//100
    console.log(num2)//200
}
console.log(num)//100
fun()
console.log(num2)//undefined

闭包

闭包有两种情景
情景一:

function fun(){
    var a = 2
    return function(){
        console.log(a)
    }
}
var f = fun()
var a = 6
f()// 2

情景二:

function fun(){
    var a = 2
    return function(){
        console.log(a)
    }
}
var f = fun()
function fun2(f) {
    var a = 6
    f()// 2
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值