搜尋

首頁  >  問答  >  主體

javascript - console.log(typeof(named));的位置不同,第二個為什麼會顯示undefined ?

#為什麼位於全域作用域中的 console.log(typeof(named)); 存取不了函數表達式的名字?
函數宣告後,名字不是暴露在全域作用域了嗎,求解

某草草某草草2690 天前817

全部回覆(1)我來回復

  • 怪我咯

    怪我咯2017-07-05 10:49:50

    函數表達式與函數宣告有幾點重要差異:

    1, 函數宣告會定義一個同名的變量,這個變數就是函數本身。函數表達式只是把定義的函數當成一個值,即使在function後加一個名字,它也不會把這個名字定義成變量,這個函數表達式是一個值,可以賦給其他變量。

    function a(){} // 函数声明,同时在外部作用域定义了可以使用的变量a
    var b = function(){} //函数表达式,匿名函数是一个值,赋值给了变量b
    var d = function c(){} //函数表达式,函数本身是一个值,没有在外部作用域定义变量c,但赋值给了变量d。

    2, 可以看到函數表達式裡可以寫function()也可以寫function c(),既然後者也不會在外部作用域定義變數c,那麼它們的區別在哪裡,簡單說有兩點:

    • var d = function c(){}裡的d.name是存在的,值為字串c,而var b = function(){}裡的b.name是個undefined。

    • function c(){}的函數體內部作用域,變數c是存在的,並且就是函數本身,和外部作用域的變數d等價,而匿名函數function(){}內部只能用變數b來引用。

    所以這就解釋了你在function named(){}函數體內訪問到了named這個變量,而在外部作用域得到的是個未定義變量的問題。

    回覆
    0
  • 取消回覆