为了账号安全,请及时绑定邮箱和手机立即绑定

js作用域问题

js作用域问题

慕粉初学者 2017-02-21 12:54:49
为什么第一个输出的是function a(){}  下面函数调用传了参数fn(1)  这个参数没有改变预解析时  a=function a(){}吗。还是在传参的时候不会向下面var a=2一样的表达式改变  a的值
查看完整描述

2 回答

?
Walk_

TA贡献48条经验 获得超30个赞

问题挺有意思的。

为什么第一个输出的是function a(){}?

 因为函数声明会提升到当前作用域的顶部。

下面函数调用传了参数fn(1)  这个参数没有改变预解析时  a=function a(){}吗。还是在传参的时候不会向下面var a=2一样的表达式改变  a的值

这句话没太看懂,只下说我的理解:不管你给不给函数fn1()传递参数,最后输出的结果都是一样。

假设我们传入参数:1 ,这时1=参数a,参数a进入函数后。

函数内会首先做两件事: 变量声明提升函数声明提升,即把变量和函数的声明提升到当前作用域的顶部。(具体可自行百度)。

于是函数内的代码会变成这样子:

function fn1(a){
  var a; 
  function a(){};
    console.log(a);  
    a=2; 
    console.log(a);
}

可见,我们传进函数内的参数a被函数内部声明的变量a先覆盖掉了。


以上是个人拙见,如有错误,欢迎指正。

查看完整回答
反对 回复 2017-02-21
  • 慕粉初学者
    慕粉初学者
    传不传参是跟预解析关系不大因为function()括号里面加了参数就会有预解析;我是因为看到function fn1(a){console.log(a);}fn1(1)才会对上的有疑问因为这里很明显传进去的东西改变了a
  • 2 回答
  • 0 关注
  • 1274 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信