《你不知道的JavaScript(上卷)》4.9 函数作用域和块作用域

《你不知道的JavaScript (上卷) 》

第三章函数作用域和块作用域

隐藏变量和函数

ES5中没有块作用域,有时候需要“隐藏”变量和函数,有很多原因促成了这种基于作用域的隐藏方法。 它们大都是从最小特权原则中引申出来的, 也叫最小授权或最小暴露原则。 这个原则是指在软件设计中, 应该最小限度地暴露必
要内容, 而将其他内容都“隐藏” 起来, 比如某个模块或对象的 API 设计。

“隐藏” 作用域中的变量和函数所带来的另一个好处, 是可以避免同名标识符之间的冲突,
两个标识符可能具有相同的名字但用途却不一样, 无意间可能造成命名冲突。 冲突会导致
变量的值被意外覆盖。

对于全局命名空间:

变量冲突的一个典型例子存在于全局作用域中。 当程序中加载了多个第三方库时, 如果它
们没有妥善地将内部私有的函数或变量隐藏起来, 就会很容易引发冲突。
这些库通常会在全局作用域中声明一个名字足够独特的变量, 通常是一个对象。 这个对象
被用作库的命名空间, 所有需要暴露给外界的功能都会成为这个对象( 命名空间) 的属
性, 而不是将自己的标识符暴漏在顶级的词法作用域中。

另一种避免冲突的方法是模块管理:另外一种避免冲突的办法和现代的模块机制很接近, 就是从众多模块管理器中挑选一个来使用。 使用这些工具, 任何库都无需将标识符加入到全局作用域中, 而是通过依赖管理器的机制将库的标识符显式地导入到另外一个特定的作用域中。

目前还没有用到

函数的作用域:

为了避免函数污染作用域可以使用立即执行表达式(IIFE)

var a = 2;
(function IIFE( global ) {
	var a = 3;
	console.log( a ); // 3
	console.log( global.a ); // 2
})( window );
console.log( a ); // 2

我们将 window 对象的引用传递进去, 但将参数命名为 global, 因此在代码风格上对全局
对象的引用变得比引用一个没有“全局” 字样的变量更加清晰。 当然可以从外部作用域传
递任何你需要的东西, 并将变量命名为任何你觉得合适的名字。 这对于改进代码风格是非
常有帮助的。

块作用域:

是一个用来对之前的最小授权原则进行扩展的工具, 将代码从在函数中隐藏信息
扩展为在块中隐藏信息。

try/catch

非常少有人会注意到 JavaScript 的 ES3 规范中规定 try/catch 的 catch 分句会创建一个块作
用域, 其中声明的变量仅在 catch 内部有效。

let关键字
  1. let关键字可以将变量绑定到所在的任意作用域中,换句话说let为其声明的变量隐式地定义了其所在的块作用域。
  2. 注意:用 let 将变量附加在一个已经存在的块作用域上的行为是隐式的。 在开发和修改代码的过
    程中, 如果没有密切关注哪些块作用域中有绑定的变量, 并且习惯性地移动这些块或者将
    其包含在其他的块中, 就会导致代码变得混乱。
  3. 提升是指声明会被视为存在于其所出现的作用域的整个范围内。
    但是使用 let 进行的声明不会在块作用域中进行提升。 声明的代码被运行之前, 声明并不
    “存在”。

今日let关键字未看完,明日继续!

Page 22 ~ Page 33 2021.04.09 21:42

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值