一、作用域和作用链
1.什么是作用域?
标识符可以访问的范围。
2.什么是标识符?
变量名、函数名、函数的形参、对象的属性名
3.作用域分类?
局部作用域、全局作用域、快级作用域(ES6新增的)let const 声明的变量才有快级作用域
4.作用链查找规则--就近原则
先找到自己的作用域,如果自己没有就一层层向上找,找到直接使用。如果在window都找不到就报错
二、函数的进阶
1.函数
1.函数的作用
提高复用率,易维护
2.函数的声明?
函数声明式、函数表达式
3.函数的参数?
形参,实参
4.函数命名规则?
一般建议使用小驼峰命名规则。[潜规则]
5.函数的返回值?
函数的计算结果,外面是否要使用。要使用就返回值。没有返回值,默认返回undefined。
6.函数不调用不执行。可以调用多次。
2.es6的默认参数【缺省参数】
function 函数名称(形参 = 默认值){...}
3.rest参数
1.arguments内置对象【了解】
缺陷:伪数组、箭头函数没有
2.rest参数【ES6】取代arguments内置对象
数组、所有函数都有 语法:function 函数名称(...形参) {...}
4.箭头函数---ES6语法糖,提高开发效率
const 变量名 = () => {}
1.语法:() => {}
2.如果函数体只有一行代码的时候,可以省略{}、return
3.如果形参只有一个的时候,可以省略(),建议不要省。
5.IIFE【ES5】立即执行函数表达式【了解】
语法结构:(function(){...})();
优势:
1.不用调用,自己调用
2.保护变量,防止全局污染。
三、闭包
1.什么是闭包?
函数内部标识符跨作用域。函数和标识符总和
2.语法结构:
1.外部函数(标识符) + 内部函数(访问标识符)
function 外部函数(){ //标识符 return function 内部函数(){ 使用标识符 } } 变量 = 外部函数() //变量接收的内部函数 变量() //调用的内部函数
2.利用IIFE自己调用一次外部函数,外部函数把内部函数挂载window上
;(function(){ 标识符 window.变量名 = function 内部函数(){ 使用标识符 } })(); 变量名()
3.作用
1.保护变量,防止全局污染。
2.形成一个简单的模块化。
3.ES6已经全部解决了闭包。闭包被ES6抛弃了。4.缺陷?
闭包如果过量使用,会造成内存溢出。