昨天写了闭包
今天就来聊聊块级作用域的事情
在绝大多数编程语言中,都有块级作用域这个概念
什么是块级作用域呢?
前面我们在刚开始讲的时候说过,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中的块级作用域就先讲到这啦~~ 明天再见