一.执行上下文
执行上下文可以理解为函数执行的环境,每一个函数执行时,都会给对应的函数创建这样一个执行环境。
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++的封装
本文深入解析JavaScript中的执行上下文概念,包括变量提升、块级作用域以及闭包的原理。通过具体代码示例,阐述了这些特性如何影响变量的查找与使用,为理解和调试JS代码提供关键洞察。
1017

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



