Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域

昨天写了闭包

今天就来聊聊块级作用域的事情

在绝大多数编程语言中,都有块级作用域这个概念

什么是块级作用域呢?

前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块

块级作用域,指的就是这种代码块作用域

在其它类C的语言中,都拥有块级作用域

块级作用域

最常见的例子就是,在有块级作用域的语言中循环中声明的 i 

只在当前的循环中可以访问,并不会污染全局变量

JS就不一样了,循环结束后 i 在循环的外部依然可以访问

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

这就是因为JS中没有块级作用域

虽然在ES6中JS也有块级作用域,但是只有用let const 声明的变量才有块级作用域

没有块级作用域,但我们又希望代码不要污染全局作用域,那么怎么办呢?

模仿块级作用域

作为一个合格的程序员,当没有现成的轮子的时候,怎么办?当然是自己造轮子了啊

我们知道JS虽然没有块级作用域,但是有函数作用域啊

所以我们可以使用函数作用域来模仿块级作用域

首先我们要知道函数作用域和块级作用域的区别在哪里

和块级作用域相比,函数作用域无法就是多了一个函数名引用,占用的内存不会被自动回收嘛

那有一种函数不就很适合干这个事情嘛——匿名函数

现在还有一个问题,函数需要我们调用啊

也简单,我们使用函数表达式自执行不就完事儿了嘛

所以有代码如下:

(function(){
    // ...
})();

PS. 只有函数表达式才能自执行,function声明的时候加()并不会立即执行,还会报错

将函数转为函数表达式的方法出来加小括号之外,JS中的一元操作符可以让函数转为函数表达式

! ~  + - 

 

 JS中的块级作用域就先讲到这啦~~ 明天再见

原文地址:https://www.cnblogs.com/lhyxq/p/10189457.html