如何深入理解Javascript in var scope&关闭?

时间:2016-12-17 12:50:02

标签: javascript scope closures

  

我无法理解为什么 a1 =功能

     

我的值 1 传递给 fn()

     

是否被 var a

所淹没

问题看起来像是由同名(var& function)引起的!

function fn(a) {
    console.log("a1 = " + a);
    var a = 2;
    function a() { }
    console.log("a2 = " + a);
}
fn(1);
// a1 = function a() { }
// a2 = 2

function fnx(ax) {
    console.log("a1 = " + ax);
    var ax = 2;
    function b() { }
    console.log("a2 = " + ax);
}
fnx(1);
// a1 = 1
// a2 = 2

/* it equal to the final version */
function fn(a) {
    var a;
    a = function() { }
    // function hoisting > variable hoisting
    console.log("a1 = " + a);
    a = 2;
    console.log("a2 = " + a);
}
fn(1);
// a1 = function a() { }
// a2 = 2

1 个答案:

答案 0 :(得分:2)

  

我无法理解为什么a1 =功能?

函数声明是:

  1. 提升到
  2. 中显示的功能顶部
  3. 在它们出现的函数范围内声明一个局部变量(与函数同名)(这不是相关的,因为参数定义也是这样)
  4. 将自己指定为该变量的值
  5.   

    我的值1传递给fn(),

    由函数声明

    覆盖
      

    是否被var a?

    所淹没

    var被忽略,因为已经有一个名为a的本地变量。

    赋值会覆盖两个console.log语句之间的函数。

    您的代码实际上与以下内容相同:

    function fn(a) {
        a = function a() { };
        console.log("a1 = " + a);
        a = 2;
        console.log("a2 = " + a);
    }
    fn(1);