+-
匿名函数闭包模仿块级作用域,轻松解决开发中的两大难题
首页 专栏 javascript 文章详情
0

匿名函数闭包模仿块级作用域,轻松解决开发中的两大难题

发的规划通电话 发布于 13小时前

匿名函数闭包模仿块级作用域

一、引言 二、什么是块级作用域 三、如何模仿块级作用域 四、模仿块级作用域的作用 (1)减少闭包占用内存的问题 (2)避免多人开发时造成的命名冲突 五、使用匿名函数闭包时的注意点 (1)匿名函数自调用的理解 (2)匿名函数自调用前面要加一个分号; 六、结束语

一、引言

首先,还没有了解过作用域链闭包的小伙伴可以点击下面三篇文章进行学习一下,方便对本文内容的理解。

1、从零开始讲解JavaScript中作用域链的概念及用途 2、 解析面试常问题之JavaScript中的闭包概念及应用,顺便普及一下大家口中常说的内存泄漏问题 3、 JavaScript的垃圾回收机制,清除无用变量,释放多余内存,展现更好的性能

二、什么是块级作用域

在例如Java 、C++等语言中,一个 for循环语句中定义了一个变量 i ,那么该变量就只属于这个 for循环语句块中,即循环结束后,自动销毁该语句块中定义的变量。这个 for循环语句形成的一个作用域就叫做块级作用域

了解过作用域链就能知道,在JavaScript中能形成作用域的就只有函数以及全局。 例如下列这个例子

`function input() {
    for(var i=0; i < 10; i++) {
        console.log(i)
    }
    
    alert(i)                //返回10
}` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7

我们可以看到,如果 for语句能形成块级作用域,那么 alert(i) 就应该会报错,但最后却成功返回了一个值,说明 for循环是无法形成块级作用域的。

三、如何模仿块级作用域

上文也说了,JavaScript中函数可以形成一个单独的作用域,所以我们就可以通过定义一个匿名函数并进行自调用的方式来模拟出一个块级作用域来。

看一下上述例子改造后是什么样子的

function input() {
    (function () {
        for(var i=0; i < 10; i++) {
            console.log(i)
        }
    })();
    

    alert(i)                //报错: i is not defined
}

input()
javascript
阅读 12 更新于 13小时前
赞 收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
发的规划通电话
1 声望
0 粉丝
关注作者
0 条评论
得票 时间
提交评论
发的规划通电话
1 声望
0 粉丝
关注作者
宣传栏

匿名函数闭包模仿块级作用域

一、引言 二、什么是块级作用域 三、如何模仿块级作用域 四、模仿块级作用域的作用 (1)减少闭包占用内存的问题 (2)避免多人开发时造成的命名冲突 五、使用匿名函数闭包时的注意点 (1)匿名函数自调用的理解 (2)匿名函数自调用前面要加一个分号; 六、结束语

一、引言

首先,还没有了解过作用域链闭包的小伙伴可以点击下面三篇文章进行学习一下,方便对本文内容的理解。

1、从零开始讲解JavaScript中作用域链的概念及用途 2、 解析面试常问题之JavaScript中的闭包概念及应用,顺便普及一下大家口中常说的内存泄漏问题 3、 JavaScript的垃圾回收机制,清除无用变量,释放多余内存,展现更好的性能

二、什么是块级作用域

在例如Java 、C++等语言中,一个 for循环语句中定义了一个变量 i ,那么该变量就只属于这个 for循环语句块中,即循环结束后,自动销毁该语句块中定义的变量。这个 for循环语句形成的一个作用域就叫做块级作用域

了解过作用域链就能知道,在JavaScript中能形成作用域的就只有函数以及全局。 例如下列这个例子

`function input() {
    for(var i=0; i < 10; i++) {
        console.log(i)
    }
    
    alert(i)                //返回10
}` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7

我们可以看到,如果 for语句能形成块级作用域,那么 alert(i) 就应该会报错,但最后却成功返回了一个值,说明 for循环是无法形成块级作用域的。

三、如何模仿块级作用域

上文也说了,JavaScript中函数可以形成一个单独的作用域,所以我们就可以通过定义一个匿名函数并进行自调用的方式来模拟出一个块级作用域来。

看一下上述例子改造后是什么样子的

function input() {
    (function () {
        for(var i=0; i < 10; i++) {
            console.log(i)
        }
    })();
    

    alert(i)                //报错: i is not defined
}

input()