JS 预解析问题

    var z = 10; //预解析声明  var
    function foo(){ // 通过预解析机制 并定义 
            console.log(z);
    }

    (function(funArg){  //自执行函数:定义和执行一起完成
            console.log(funArg)
            var z = 20;
            funArg();
    })(foo);
    
    一直不了解为什么会输出是  10  。
    请各位大神解答一下。
阅读 2.4k
4 个回答
  1. 函数的参数是 按值传递 的,但是,传递引用类型的参数,即使是按值传参,名参(funArg)也会按引用来访问同一个对象(foo函数对象)。
  2. JavaScript采取的是 静态作用域(词法作用域),即在书写代码或者说定义时确定的作用域。

词法作用域啊,foo在定义的时候,已经关联到外层变量z=10,所以无论如何,当你调用foo时,都只会获取外层那个值为10z,在其他地方定义的z都不会影响到foo

函数的作用域在它定义的时候就决定了。foo函数定义时,它只能访问外部的z。即使之后在自执行函数里面被调用,也无法访问自执行函数里面的z了。

新手上路,请多包涵

预解析,自调用函数里的var Z被提升到console.log(funArg)之前,所以里面的数是undefined。而且还是个局部作用域。

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