标签:span 作用域 function exp loop The java var mes
第二章,作用域由一系列的bubbles组成。每一个都代表了一个container或bucket,装着被声明的identifiers(variables, functions)。这些bubbles相互嵌套。这种嵌套是在开发阶段写完的。
什么制造了一个新的bubble? 只是函数吗?其他的JS结构可以创建bubbles of scope吗?
探索函数作用域和它的暗示implications.
函数作用域内的所有变量都属于这个函数,并能够反复在这个函数内使用(甚至在嵌套的作用域中)。
这种设计方法非常有用,可以充分利用动态的自然javascript变量, 在需要时携带不同类型的值。
另一方面,如果不小心,变量跨出一个作用域将导致一些意外的陷阱。
软件界的设计原则: 最少的特权。最少的暴露。比如为一个对象/模块的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();
全局作用域可能发生变量碰撞。比如多个库被引用进你的程序。导致一些函数/变量的名字相同。
可以使用‘namespace’,声明一个对象。在这个对象内使用库的方法:
var MyReallyCoolLibrary = { awesome: "stuff", doSomething: function() { // ... }, doAnotherThing: function() { // ... } };
避免变量碰撞的另一个方法是更现代的module方法。使用相关的managers。
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