缘由
javascript中的函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行 查了查词法作用域,知乎上有一问有助理解访问
var foo=1;
function static(){
alert(foo);
}
!function(){
var foo=2;
static(); //结果为1
}();
- 词法作用域等同于静态作用域(eval和with可以构成动态作用域)
- strict模式下完全是静态作用域(声明的作用域是根据程序正文在编译时就确定的),用with就会报错
- 感叹号是将后续的函数作为可以直接执行的函数表达式, 还能用new function(){…} 这样还能省去最后的一对括号。
- !function(){}() 返回的是true,就算!function(){return false;}() 返回的也是true。而new function(){return false;}返回的始终是Object {}
下面看点不同
var foo=1;
function static(){
alert(foo);
}
!function(){
foo=2;
static(); //结果为2
}();
上下文
var myAlerts = [];
for (var i = 0; i < 5; i++) {
myAlerts.push(
function inner() {
alert(i);
}
);
}
myAlerts[0](); // 5
myAlerts[1](); // 5
myAlerts[2](); // 5
myAlerts[3](); // 5
myAlerts[4](); // 5
inner()方法是一个全局的方法,所以它的作用域链是静态的绑定在全局上下文中的。inner函数解析的i,是在全局的上下文中,在每次解析时已经加到了5 访问