问什么输出的是3 1 2

var foo=1;
(function(foo) {
    console.log(foo);

    var foo = 2;
    console.log(this.foo);
    console.log(foo);
})(3);

这一段代码为什么输出的是
clipboard.png

阅读 1.7k
2 个回答

预编译过程:
匿名函数的作用域两部分:
go(全局):foo:1;
ao(函数内):变量申明步骤:1.形参与变量提升,并为其赋值为undefined也就是foo=undefined;2.形参实参值同一,也就是foo=3;3.内部函数申明提升,其值为函数自身,(变量与函数同名时,回覆盖变量,函数申明提升优于变量申明提升)
执行过程:
从作用域中找foo,所以先输出3,然后foo=2(这时ao中的foo就等于2了);输出this.foo(因为this指向window),所以输出window.a=全局a=1;最后输出ao中的2;

首先 你这个是拉姆达函数(也叫匿名自执行函数兄弟); 这样的话你把参数3传进去 按照JS单线程语言的特性 会从上到依次执行所以先打印出来3 然后呢 你这个this指向的是window所以接下来打印的是1 因为你有个全局的1 之后的就是你初始化赋值之后的2 基本就是这么跑出来的结果

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题