(function IIFE( def ) { def( window );
})(function def( global ) {
var a = 3;
console.log( a ); // 3 console.log( global.a ); // 2
});
函数表达式 def 定义在片段的第二部分,然后当作参数(这个参数也叫作 def)被传递进 IIFE 函数定义的第一部分中。最后,参数 def(也就是传递进去的函数)被调用,并将 window 传入当作 global 参数的值。
块作用域
尽管函数作用域是最常见的作用域单元,当然也是现行大多数 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 并没有块作用域的相关功能。
标签:bar,变量,作用域,JavaScript,js,var,def From: https://blog.51cto.com/u_16255561/9355709