lexical_scope

今天下午看了一篇文章,看到最后一个案例的时候,和我预想的有些不一样,有点蒙,顿时感觉自己之前的理解都是错的.其实不然.先来看下这个案例.

var num = 123;
function f1() {
   console.log( num );
}

function f2() {
    num = 456;
    f1();
}
f2()

我以为输出的是123,但是并不是,是123.然后就在想了,为啥?

难道是f2里执行f1的时候,f1查找num是在f1里查找不到的时候,再跑到f2里查找的吗? 难道我之前记错了?词法作用域不是在声明的时候就确定了环境,而是在运行的时候确定的吗?不会吧? 我觉得不可能, 那么我们来试试.

var num = 123;
function f1() {
   console.log( num );
}

function f2() {
    var num = 456; // add var keywords
    f1();
}
f2()

咦,果然,输出了123. 可是为啥之前的会改变? 原来不是因为查找顺序,而是因为在调用f1之前,修改了全部变量. 添加了关键字之后,他只是声明了对应词法作用域的变量,并未污染到全局.

Last updated