全局变量名、局部变量名和形参名冲突时,覆盖情况

文章纠正了关于全局变量、局部变量和形参名冲突的误解,指出全局变量不会被形参覆盖,而局部变量与形参的冲突遵循作用域规则。在函数内部,形参和局部变量属于同一作用域,重复声明不赋值不会影响变量,赋值则会覆盖原有值。
摘要由CSDN通过智能技术生成

以前错误的认为,全局变量名、局部变量名和形参名相同时,全局变量(也就是外部变量)被形参覆盖,形参被局部变量覆盖。

今天发现这样理解并不对。比如

function foo(num){
  var num;
  console.log(num);  
}
foo(1)   //  1

//如果错误的理解为局部变量会覆盖形参的话,会认为会输出undefined

那事实是什么呢。实际上变量名冲突分两种,一种是函数外的变量和函数里的局部变量的冲突,一种是函数内部的冲突。

第一种冲突,我把它理解为是作用域链的上游(最上游是全局对象的命名空间)会被下游函数的局部变量覆盖。

其实我觉得这就是一种继承关系,好比原型链里离目标对象近的新的方法覆盖远的旧的方法,甚至是好比HTML/CSS里字体、颜色等属性的继承。

只不过这里继承的是一个上下文环境。

它们都有一个特点,自己有,用自己的;自己没有,用父级的;父级没有,再逐级向上。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值