important
词法分析
- 词法作用域:函数在定义它的作用域中执行,而不是在调用它的作用域中执行。作用域
- 还不错的作用域讲解
- 无块级作用域,函数限定变量作用域,try{}catach(){}会产生类似的块级作用域。
词法作用域和动态作用域区别
var a = 2;
function foo() {
console.log( a );
}
function bar() {
var a = 3;
foo();
}
bar();
- 如果处于词法作用域,也就是现在的javascript环境。变量a首先在foo()函数中查找,没有找到。于是顺着作用域链到全局作用域中查找,找到并赋值为2。所以控制台输出2
- 如果处于动态作用域,同样地,变量a首先在foo()中查找,没有找到。这里会顺着调用栈在调用foo()函数的地方,也就是bar()函数中查找,找到并赋值为3。所以控制台输出3
总结:javascript是遵循词法作用域的,但是在用到this的时候是遵循动态作用域的。
if(true) {
var num = 10;
}
alert(num);//运行的结果是弹窗10.
------
var func = function() {
var num = 10;
};
try {
alert(num);
} catch ( e ) {
alert( e );
}//这段代码运行时,会抛出一个异常,变量num没有定义.也就是说,定义在函数中的变量无法在函数外使用,当然在函数内可以随意的使用, 即使在赋值之前.
- 变量名提升与函数名提升(ES6将不存在这一现象)