以前错误的认为,全局变量名、局部变量名和形参名相同时,全局变量(也就是外部变量)被形参覆盖,形参被局部变量覆盖。
今天发现这样理解并不对。比如
function foo(num){ var num; console.log(num); } foo(1) // 1 //如果错误的理解为局部变量会覆盖形参的话,会认为会输出undefined
那事实是什么呢。实际上变量名冲突分两种,一种是函数外的变量和函数里的局部变量的冲突,一种是函数内部的冲突。
第一种冲突,我把它理解为是作用域链的上游(最上游是全局对象的命名空间)会被下游函数的局部变量覆盖。
其实我觉得这就是一种继承关系,好比原型链里离目标对象近的新的方法覆盖远的旧的方法,甚至是好比HTML/CSS里字体、颜色等属性的继承。
只不过这里继承的是一个上下文环境。
它们都有一个特点,自己有,用自己的;自己没有,用父级的;父级没有,再逐级向上。
<