«

执行环境和作用域 函数进阶 闭包

yang 发布于 阅读:412 JS高阶阶段


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就是立即执行 函数表达式

  1. 将函数变成表达式,办法很多
  2. 让函数立即执行

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 闭包的作用

闭包主要是用于封装插件、模块、库,将所有的功能实现封装在函数内部,避免造成全局污染

执行环境和作用域 函数进阶 闭包

版权所有:微4e
文章标题:执行环境和作用域 函数进阶 闭包
除非注明,文章均为 微4e 原创,请勿用于任何商业用途,禁止转载

推荐阅读:


扫描二维码,在手机上阅读
请先 登录 再评论