js中的块级作用域

时间:2021-12-12 00:30:33

概述

函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则.

但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏变量或函数的需求, 这就是块级作用域的由来.

下面是不用es6实现块级作用域的三种方法, 供以后开发时参考, 相信对其他人也有用.

IIFE

IIFE, 即立即执行函数, 用一个函数作用域(闭包)来模拟块级作用域.示例如下:

//es6中的块级作用域
{let a = 1;
console.log(a);}
console.log(a); //ReferenceError //IIFE实现
(function() {
var a = 1;
console.log(a);
})();
console.log(a); //Undefined

可以看到, 由于变量提升, a不再是未初始化, 而是未定义. 这是使用IIFE不好的一方面, 但还可以接受. 另一方面由于闭包拥有很多不好的特性, 比如this指向改变啊, return,break和continue发生变化啊, 内存泄漏问题啊等等, 所以IIFE并不是一个普适的方案.

throw

es3开始, js中就已经定义了一种块级作用域, 它就是throw函数. 示例如下:

//es6中的块级作用域
{let a = 1;
console.log(a);}
console.log(a); //ReferenceError //throw函数实现
{
try {
throw undefined;
} catch(a) {
a = 2;
console.log(a);
}
}
console.log(a); //ReferenceError

之前我在看别人的代码的时候觉得用throw好像很高级, 可能是为了实现块级作用域吧.

当有多个变量时, 我们一般不用a, 而是用err123456等.

优雅的方案

如果用babel编译一下如上代码, 会发现编译出来的es5与上面的方案都不同, 它是这么编译的.

//es6中的块级作用域1
{let a = 1;
console.log(a);}
console.log(a); //ReferenceError //babel编译1
"use strict";
{
var _a = 1;
console.log(_a);
}
console.log(a); //ReferenceError //es6中的块级作用域2
{let a = 1;
console.log(a);
let _a = 2;
console.log(_a);
}
console.log(a);
console.log(_a); //babel编译2
"use strict";
{
var _a2 = 1;
console.log(_a2);
var _a3 = 2;
console.log(_a3);
}
console.log(a);
console.log(_a);

哈哈, 是不是很优雅? 虽然会在全局初始化_a等变量, 但是没有太大的问题.

js中的块级作用域的更多相关文章

  1. 一个经典的js中关于块级作用域和声明提升的问题

    function functions(flag) { if (flag) { function getValue() { return 'a'; } } else { function getValu ...

  2. JS中的块级作用域,var、let、const三者的区别

    1. 块作用域{ } <script type="text/javascript"> { var a = 1; console.log(a); // 1 } conso ...

  3. 可怜的js居然没有块级作用域

    js中在一个函数中定义一个for循环:for(var i=0;i<5;i++) 其中的i并不会随着for循环的结束就销毁,i会一直存在该函数中,这就是js和其他语言的区别,也就是js没有块级作用 ...

  4. javascript中模仿块级作用域

    学过 javascript 的都知道 javascript 里面没有块级作用域的概念,这就意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,看下面的例子: function outPu ...

  5. es6中添加块级作用域的目的

    原本只有函数作用域和全局作用域两种,这就导致出现很多不方便的地方: 1)for循环问题:在看js高程的时候,纠结在第七章好久,就是一个这样的实例 function createFunctions(){ ...

  6. Javascript中没有块级作用域(模仿)

    在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域).而在javascript中则没有块级作用域,首先来看一段代码: function test(){ for(var ...

  7. JavaScript的作用;JS常见的三种对话框;&equals;&equals;和&equals;&equals;&equals;的区别;函数内部参数数组arguments在函数内部打印实参;JS的误区&colon;没有块级作用域

    JS:客户端(浏览器)脚本语言 弱类型 基于原型 事件驱动 不需要编译(直接运行)   JS的作用:表单验证,减轻服务端的压力 添加页面动画效果  动态更改页面内容  Ajax网络请求 (一)常见的对 ...

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

    昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...

  9. 你不知道的JS之作用域和闭包(三)函数 vs&period; 块级作用域

      原文:你不知道的js系列 在第(二)节中提到的,标识符在作用域中声明,这些作用域就像是一个容器,一个嵌套一个,这个嵌套关系是在代码编写时定义的. 那么到底是什么产生了一个新的作用域,只有函数能做到 ...

随机推荐

  1. 和小猪一起搞微信公众号开发—获取Access&lowbar;token

    前言 前一篇小猪和大家分享了如何回复用户的简单文本,这一篇我们来看看如何获取Access_token 介绍 在前一篇中,我们实现了这么一个简单的过程:用户发送一个文本到公众号后,公众号在该文本后面加上 ...

  2. leetcode 题解 Add Two Numbers(两个单链表求和)

    题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...

  3. DzzOffice添加动态壁纸例子-Bing每日壁纸

    Bing每日壁纸介绍:bing网站每天会更新一张不同的精选图片. 此压缩包内的程序,可以自动同步更新cn.bing.com网站每天更新的图片,作为dzzoffice的壁纸使用.实现自动每天更换不同的云 ...

  4. hdu 1094 A&plus;B for Input-Output Practice &lpar;VI&rpar;

    A+B for Input-Output Practice (VI) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/327 ...

  5. Apache HTTP Server suEXEC符号链接任意文件访问漏洞

    漏洞版本: Apache HTTP Server 2.2.22 漏洞描述: Apache HTTP Server是一款开源的WEB服务程序 Apache HTTP Server包含的suEXEC会不安 ...

  6. RAILS ON

    我是按照下面这个URL来轻快安装的. http://lxiaodao.iteye.com/blog/1579992 (1)RVM官方网站应该是改版过一次, 使用 curl -L https://get ...

  7. 安装python2&period;7&period;13-64bit &amp&semi; Pycharm在两个python版本之间切换

    本来已经安装了32位的python27,但在使用轮廓系数评估k-means模型的优良性时,出现了内存溢出的报错.原来32为的python编译器最多只能使用4GB的内存,所以就打算换成64位的pytho ...

  8. Felx布局(三)

    flex网格布局 平均分布 最简单的网格布局,就是平均分布.在容器里面平均分配空间,跟上面的骰子布局很像,但是需要设置项目的自动缩放

  9. BZOJ 3105&colon; &lbrack;cqoi2013&rsqb;新Nim游戏 &lbrack;高斯消元XOR 线性基&rsqb;

    以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...

  10. localhost和127&period;0&period;0&period;1及ip区别

    1.127.0.0.1是回送地址,指本地机,一般用来测试使用.回送地址是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什 ...