JS 作用域与闭包

本文深入解析JavaScript中的执行上下文概念,包括变量提升、块级作用域以及闭包的原理。通过具体代码示例,阐述了这些特性如何影响变量的查找与使用,为理解和调试JS代码提供关键洞察。

一.执行上下文
执行上下文可以理解为函数执行的环境,每一个函数执行时,都会给对应的函数创建这样一个执行环境。

js是解释型语言,js代码在执行前遇到上下文会干如下的事

(1)把变量定义先拎出来
(2)把函数声明先拎出来
(3)this
(4)arguments

上述的东西先拿出来占个位

console.log(a)
var a

fn('zhangsan')
function fn(name) {
    age = 20
    console.log(name, age)
    var age
}

注:如果将var换成let就会报错,这是为什么呢?
因为在let 和 const 不支持变量提升
那什么是变量提升呢?
所谓的变量提升就是
例如 上述代码第1行在执行的时候输出underfined而不报错
因为a这个变量提升了,为什么?因为在执行前,a变量就被拎出来了
但是用let 和 const就不会

二.块级作用域

无块级作用域 ES5
用var定义变量时

 if(true) {
     var a = 200
 }
 console.log(a)

有块级作用域(ES6)
用const or let定义常量和变量时

if(true) {
    let a = 200
}
console.log(a) //报错

函数和全局作用域
类似C/C++.如果在找寻一个变量的时候,会先在最近的大括号里面查询
例如

let a = 1
function fn() {
	let a = 2
	console.log(a) // 2
}

显然打印的是2

三.闭包
闭包: 函数在哪里定义,作用域就在那里

function F1() {
    let a = 200
    return function() {
        console.log(a)
    }
}

let fn = F1()
let a = 300
fn()    //打印仍是200

因为函数在 F1里面定义,因此作用域就在函数体里面
这个时候的a因为返回的函数体没有a这个变量
他就会往父作用域去找,找到了a = 200
就输出200,而不会输出300
这里同理,对于函数作为参数进行传递也是一样的
关键是函数在哪里定义
闭包主要应用在不被外接侵扰的内部变量定义,类似于C++的封装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值