码迷,mamicode.com
首页 > Web开发 > 详细

You Don't Know JS: Scope & Closures (第3章: 函数 vs 块作用域)

时间:2018-10-03 00:30:04      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:span   作用域   function   exp   loop   The   java   var   mes   

第二章,作用域由一系列的bubbles组成。每一个都代表了一个container或bucket,装着被声明的identifiers(variables, functions)。这些bubbles相互嵌套。这种嵌套是在开发阶段写完的。

 

什么制造了一个新的bubble? 只是函数吗?其他的JS结构可以创建bubbles of scope吗?

 

Function Vs. Block Scope


 

 

Scope From Functions

探索函数作用域和它的暗示implications.

函数作用域内的所有变量都属于这个函数,并能够反复在这个函数内使用(甚至在嵌套的作用域中)。

这种设计方法非常有用,可以充分利用动态的自然javascript变量, 在需要时携带不同类型的值。

另一方面,如果不小心,变量跨出一个作用域将导致一些意外的陷阱。

 

Hiding in Plain Scope

软件界的设计原则: 最少的特权。最少的暴露。比如为一个对象/模块的API, 你应当只暴露那些必要的代码。

这个原则扩展到:哪个作用域包括变量和函数的选择!

因此,变量/函数不应该都在全局作用域中。这违背了原则!

技术分享图片

 

 避免碰撞

无限循环了

function foo() {
    function bar(a) {
        i = 3; // changing the `i` in the enclosing scope‘s for-loop
        console.log( a + i );
    }

    for (var i=0; i<10; i++) {
        bar( i * 2 ); // oops, infinite loop ahead!
    }
}

foo();

 

 

Global "Namespaces"

全局作用域可能发生变量碰撞。比如多个库被引用进你的程序。导致一些函数/变量的名字相同。

可以使用‘namespace’,声明一个对象。在这个对象内使用库的方法:

var MyReallyCoolLibrary = {
    awesome: "stuff",
    doSomething: function() {
        // ...
    },
    doAnotherThing: function() {
        // ...
    }
};

 

 

Module 管理

避免变量碰撞的另一个方法是更现代的module方法。使用相关的managers。


 

 

Functions As Scopes

 

 

Anonymous Vs. Named

 

Invoking Function Expressions Immediately

 

 


 

 

Blocks AS Scopes

 

try/catch

 

let

 

Garbage Collection垃圾收集

 

let Loops

 

Const

 


 

Reviews

 

You Don't Know JS: Scope & Closures (第3章: 函数 vs 块作用域)

标签:span   作用域   function   exp   loop   The   java   var   mes   

原文地址:https://www.cnblogs.com/chentianwei/p/9738604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!