簡體   English   中英

Javascript函數解析順序

[英]Javascript functions parsing order

有人可以詳細解釋為什么在以下函數中,返回值是1.5? javascript是從底部到頂部解析還是有更多內容?

    (function f() {
        function f() { return 1; }
        return f();
        function f() { return 2; }
        function f() { return 1.5; }
    })();

功能被“ 提升 ”到他們所居住的范圍的頂部。

所以你的代碼實際上是:

(function f() {
    function f() { return 1; }
    function f() { return 2; }
    function f() { return 1.5; }
    return f();
})();

QED:

(function f() {
    function f() { return 1; }
    return f();
    function f() { return 1.5; }
    function f() { return 2; }
})(); //=> 2

jsFiddle Demo

由於吊裝,這相當於

(function f(){
 var f;
 f = function(){ return 1; };
 f = function(){ return 2; };
 f = function(){ return 1.5; };
 return f();
})();

吊裝可能很棘手,因為這里有兩個方面。 首先,提升變量定義

變量的每個定義實際上都是其范圍頂部的變量聲明,以及定義所在位置的賦值。 1

接下來,提升每個函數初始化

函數初始化發生在父函數的頂部(在vars之上)。 由於名稱已作為參數或函數存在的vars聲明是no-ops,因此我們得到了一些令人驚訝的結果。 1

1: 范圍Cheatsheet MDN

當js解釋器首先進入函數時,它會查找所有var和函數結構(但不是匿名函數)並按照它們找到它們的順序對它們進行調整,之后它開始從函數的開始執行代碼。 在你的情況下f函數返回1.5是最后一個,所以它改變了previos 2 f功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM