简介:尽管函数作用域是最常见的作用域单元,当然也是现行大多数 JavaScript 中最普遍的设计 方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可 以实现维护起来更加优秀、简洁的代码。除 J ...
尽管函数作用域是最常见的作用域单元,当然也是现行大多数 JavaScript 中最普遍的设计 方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可 以实现维护起来更加优秀、简洁的代码。除 JavaScript 外的很多编程语言都支持块作用域,因此其他语言的开发者对于相关的思维 方式会很熟悉,但是对于主要使用 JavaScript 的开发者来说,这个概念会很陌生。尽管你可能连一行带有块作用域风格的代码都没有写过,但对下面这种很常见的 JavaScript 代码一定很熟悉:for (var i=0; i<10; i++) { console.log( i ); }我们在 for 循环的头部直接定义了变量 i,通常是因为只想在 for 循环内部的上下文中使 用 i,而忽略了 i 会被绑定在外部作用域(函数或全局)中的事实。这就是块作用域的用处。变量的声明应该距离使用的地方越近越好,并最大限度地本地 化。另外一个例子:var foo = true; if (foo) { var bar = foo * 2; bar = something( bar ); console.log( bar ); }bar 变量仅在 if 声明的上下文中使用,因此如果能将它声明在 if 块内部中会是一个很有 意义的事情。但是,当使用 var 声明变量时,它写在哪里都是一样的,因为它们最终都会属于外部作用域。这段代码是为了风格更易读而伪装出的形式上的块作用域,如果使用这 种形式,要确保没在作用域其他地方意外地使用 bar 只能依靠自觉性。块作用域是一个用来对之前的最小授权原则进行扩展的工具,将代码从在函数中隐藏信息 扩展为在块中隐藏信息。再次考虑 for 循环的例子:for (var i=0; i<10; i++) { console.log( i ); }为什么要把一个只在 for 循环内部使用(至少是应该只在内部使用)的变量 i 污染到整个 函数作用域中呢?更重要的是,开发者需要检查自己的代码,以避免在作用范围外意外地使用(或复用)某 些变量,如果在错误的地方使用变量将导致未知变量的异常。变量 i 的块作用域(如果存 在的话)将使得其只能在 for 循环内部使用,如果在函数中其他地方使用会导致错误。这 对保证变量不会被混乱地复用及提升代码的可维护性都有很大帮助。但可惜,表面上看 JavaScript 并没有块作用域的相关功能。除非你更加深入地研究。with过 with 关键字。它不仅是一个难于理解的结构,同时也是块作用域的一 个例子(块作用域的一种形式),用 with 从对象中创建出的作用域仅在 with 声明中而非外 部作用域中有效。try/catch非常少有人会注意到 JavaScript 的 ES3 规范中规定 try/catch 的 catch 分句会创建一个块作 用域,其中声明的变量仅在 catch 内部有效。例如:try { undefined(); // 执行一个非法操作来强制制造一个异常 } catch (err) { console.log( err ); // 能够正常执行! } console.log( err ); // ReferenceError: err not found正如你所看到的,err 仅存在 catch 分句内部,当试图从别处引用它时会抛出错误。本文仅代表作者个人观点,不代表巅云官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱2522407257@qq.com。更多相关资讯,请到巅云www.rzxsoft.cn学习互联网营销技术请到巅云建站www.rzxsoft.cn。 |