JavaScript之闭包

JavaScript作用域:全局作用域、局部作用域(块级作用域)形成的作用域链。

JavaScript变量:全局变量、局部变量。

函数内部可以读取全局作用域下的变量,全局作用域下不能读取到函数内部声明的变量。

要想从函数外部读取到函数局部变量就要使用到闭包知识:

在函数中定义一个子函数(可以访问到父层的变量),并返回该子函数作为函数调用值,这样在函数外就能读取到父函数中声明的变量

function count(){

    var num = 0;
    return function(){

        num += 1;

        console.log(num);

    }

}

var total = count();

total();// 1

total();// 2

闭包可以理解为定义在函数中的子函数,将局部作用域和全局作用域链接的一种方式

使用闭包后局部变量num在函数调用结束后不会清除回收,会保存在内存中,如果程序中过度使用闭包会造成内存消耗大,影响程序性能,在IE浏览器中会导致内存泄露问题,可以在闭包函数调用结束后,将函数置为null,清除内存

一个闭包结合this指针的示例:

var name = 'hello world';

var obj = {

    name: 'personal',

    getName: function(){

        return function(){

            console.log(this.name);

        }

    }

};

var say = obj.getName();// say为返回的匿名函数,此时say为全局变量,this指定调用它的作用域为window,所以调用say指向window.name

say();// hello world

 

var name = 'hello world';

var obj = {

    name: 'personal',

    getName: function(){

        const that = this;// 改变this的指向

        return function(){

            console.log(that.name);

        }

    }

};

var say = obj.getName();

say();// personal

将this赋给了that,在getName调用时,this指向的是调用它的对象obj,所以访问that.name时读取的是obj.name

posted @ 2021-05-18 10:24  IT小猿人  阅读(51)  评论(0编辑  收藏  举报