执行环境和作用域 函数进阶 闭包
1. 执行环境和作用域
1.1 执行环境和关联的变量对象
执行环境:执行环境是代码运行的环境,函数产生独立的执行环境,每一个执行环境关联一个隐藏的变量对象,用于保存该环境中的标识符。
执行栈:执行栈是一种栈结构,将程序运行时遇到的执行环境(函数产生独立的执行环境),放在一个栈里面,遇到一个执行环境就放入执行栈,执行结束一个环境就弹出一个环境,执行栈清空时,程序执行结束。
栈:栈是一种数据结构,操作原则:先进后出。
1.2 作用域和作用域链
作用域:是指变量起作用的范围
作用域链:是一种查找变量的规则,先在当前作用域查找变量,找不到就去上一级作用域,以此类推,直到最顶层
1.3 作用域分类
全局作用域:在函数外定义的变量就是全局变量,可以在任意地方使用
局部作用域:在函数内定义的变量就是局部变量,只能在当前函数中使用
块级作用域:ES5中没有块级作用域,ES6中使用 let const 可以实现块级作用域,在语句块内部生效
2. 函数进阶
2.1 箭头函数
箭头函数是ES6新增的语法糖, => 用于取代 function关键字
//ES5的写法
let show = function () {
console.log("今天星期三,我们在上课,好海哦");
};
show();
//ES6的箭头函数
let show2 = () => {
console.log("明天星期四");
};
show2();
//简写1:只有一个形式参数时,可以省略()
let arr = [1, 2, 3];
arr.forEach(v => {
console.log(v);
});
//简写2:代码只有一句时,可以省略{},自动返回,return可以不写
let arr2 = arr.map( v=>v+10 );
2.2 rest参数
rest参数可以获取所有的剩余
实际参数,是一个真正的数组,可以使用数组的方法
function addn(...arr){
let sum=0;
arr.forEach(v=>{
sum+=v;
});
return sum;
}
2.3 IIFE
2.3.1 什么是IIFE?
IIFE就是立即执行
函数表达式
- 将函数变成表达式,办法很多
- 让函数立即执行
2.3.2 IIFE的经典写法
//经典写法一
(function(){
var sum=0;
for(var i=1; i<=100; i++){
sum+=i;
}
console.log(sum);
})();
//经典写法二
!function(){
var sum=0;
for(var i=1; i<=100; i++){
sum+=i;
}
console.log(sum);
}();
//经典写法三
+function(){
var sum=0;
for(var i=1; i<=100; i++){
sum+=i;
}
console.log(sum);
}();
2.3.3 IIFE的优点
IIFE可以将一段代码封装在函数中,所有内部计算都在函数中进行,避免造成全局污染
3. 闭包
3.1 什么是闭包?
闭包是一种作用域的体现(闭包作用域),函数内的语句可以访问当前函数的数据和上一级作用域的数据,函数外不能访问函数内的数据,闭包可以实现函数外访问函数内的数据。
闭包一定是函数嵌套函数,让内部函数具备多重身份,即可以访问上一级的数据,又可以被全局调用。
3.2 闭包的写法
//经典写法一
(function(){
let i=1;
window.show=function(){
return ++i;
}
})();
//经典写法二
let show=function(){
let i=1;
return function(){
return ++i;
}
}();
3.3 闭包的作用
闭包主要是用于封装插件、模块、库,将所有的功能实现封装在函数内部,避免造成全局污染
推荐阅读:
扫描二维码,在手机上阅读