1.执行环境和变量对象 [ 理解 ]
-
执行环境
1.代码运行都需要一个执行环境, 默认环境"全局执行环境" 2.函数调用就会产生一个"函数执行环境",并添加到"环境执行栈中" 3.函数调用结束后,就会从"环境执行栈中"出栈,并且自动销毁,全局执行环境会保留
-
变量对象
1.每个执行环境都有一个关联的变量对象 2.变量对象主要保存了当前环境中所有"标识符"(变量 函数 函数中形参 对象中key) 3.函数调用结束后,就会出栈并销毁,变量对象也自动销毁
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9sIgz9P-1675852094776)(C:\Users\admin\Desktop\3.png)]
2.作用域和作用域链 [ 掌握 ]
-
作用域
标识符起作用的范围
-
作用域链
规定标识符查找的规则, 规则: '从里向外查找,一直查找到全局,找到就停止,如果全局都找不到那就报错'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PjC5QZ6U-1675852094778)(C:\Users\admin\Desktop\4.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VYfDTvGf-1675852094778)(C:\Users\admin\Desktop\5.png)]
- 作用域分类 [重点]
全局作用域
函数作用域 == 局部作用域
块级作用域 == 局部作用域
3.函数进阶 [ 重点 ]
3.1.函数定义
-
声明式
function 函数名 (形参, 形参, 形参='默认值'){ 功能代码 return 结果 } 函数名(实参, 实参, 实参)
-
表达式
const 变量名 = function (形参, 形参, 形参='默认值'){ 功能代码 return 结果 } 函数名(实参, 实参, 实参)
3.2箭头函数
-
理解
对匿名函数的简化写法
-
方式
const foo = function (a) { return a + 10; } const foo1 = (a) => { return a + 10; } axios.get() .then(function (res){ }) axios.get() .then(res => { })
-
特殊场景再次优化
1.函数体中只有一个return,可以去调用return和{} 2.只有一个形参,去掉()
-
注意
1.没有实参对象arguments 2.不能作为"构造函数"使用
3.3参数
-
形参
未知数据 局部变量 === 只能在定义它的函数内部使用 占位符
-
实参
调用函数时传入的实际值(具体值) 实参和形参是一一对应关系 (数据类型必须一直)
3.4 arguments [ 复习 ]
1.每个函数都有arguments,只有箭头函数没有
2.arguments是一个伪数组(类数组),不是真数组,不能用数组的方法
3.arguments通常在实参个数不确定的情况使用
3.5函数调用方式 [ 掌握 ]
1.普通函数调用 ===> 函数名()
2.作为对象方法调用 ===> 对象.方法名()
3.作为回调函数调用 ===> 函数名(回调函数) 对象.方法名(回调函数) ...
4.立即执行函数调用 ===> ;(函数)()
4. 闭包[重点记忆]
-
什么是闭包
函数内部跨作用域访问变量, 闭包就是作用域的体现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0VWyy2wp-1675852094778)(C:\Users\admin\Desktop\6.png)]
-
写法
;(function (){ let 变量a = 值; window.方法 = function (){ 访问"变量a"的方式 } })()
-
闭包解决的问题
1.循环计时器 ===> es6: let const 2.循环注册事件 ===> es6: let const 3.es5模块化 ===> es6: 模块化
-
闭包优缺点
优点: 私有化 (把变量保护起来,防止全局污染)
-
闭包解决的问题
1.循环计时器 ===> es6: let const 2.循环注册事件 ===> es6: let const 3.es5模块化 ===> es6: 模块化
-
闭包优缺点
优点: 私有化 (把变量保护起来,防止全局污染) 缺点: 形成闭包的变量会常驻内存,严重时造成内存溢出