JS函式

Zegendary發表於2017-12-13
  • ###函式宣告和函式表示式有什麼區別 (*) 函式宣告:function bar() {} 函式表示式:var fuc = foo(){} 1.函式bar將會在整個程式執行前被 hoist(提升),因此它在定bar函式的整個scope (作用域)中都是可用的。即使在函式定義之前呼叫它也沒問題。 2.對於函式宣告,函式的名稱是必須的,而對於函式表示式而言則是可選的,因此,就出現了匿名函式表示式和命名函式表示式。 3在這個函式裡 var foo = function bar() { bar(); // Works}; bar(); // ReferenceError命名函式bar賦值給了變數foo,所以在函式宣告外是不可見的,但在bar`函式內部仍然可以呼叫。這是因為Javascript對命名函式處理的機制,函式的名稱永遠在函式內部的作用域中有效。
  • ###什麼是變數的宣告前置?什麼是函式的宣告前置 (**) 所謂的變數宣告前置就是在一個作用域塊中,所有的變數都被放在塊的開始出宣告。下面通過三段程式碼舉例: 程式碼1: var a = 1; function main() { console.log(a);//1 } main();//輸出1` 程式碼2: 1 var a = 1; 2 function main() { 3 console.log(a); 4 var a = 2; 5 } 6 main()//輸出undefined 程式碼3:為什麼程式碼2會輸出undefined 1 var a = 1; 2 function main() { 3 var a; 4 console.log(a); 5 a = 2; 6 } 函式的宣告前置就是把整個函式提升到當前作用域的最前面(位於前置的變數宣告後面)。 var num = 1; console.log(doubleNum(num));//2 function doubleNum(num){ return num2;} 等價於 //函式的宣告前置 var num; function doubleNum(num){ return num2;} num = 1; console.log(doubleNum(num));//2
  • ###arguments 是什麼 (*) arguments 是一個類陣列物件。代表傳給一個function的引數列表。可以在函式內部通過使用 arguments物件來獲取函式的所有引數。這個物件為傳遞給函式的每個引數建立一個條目,條目的索引號從 0 開始。
  • ###函式的過載怎樣實現 (**) 可以通過arguments的length和引數的型別來實現。例: function sumOfSquares(a, b, c){ if(arguments.length<3){ c = 0; } return aa+bb+c*c } sumOfSquares(2,3,4); // 29 sumOfSquares(1,3); // 10
  • ###立即執行函式表示式是什麼?有什麼作用 (***) 立即執行函式通常有下面兩種寫法: (function(){...})(); (function(){ ...}());//推薦使用 在Javascript中,一對圓括號“()”是一種運算子,跟在函式名之後,表示呼叫該函式。 參考-JavaScript中的立即執行函式
  • ###什麼是函式的作用域鏈 (****) 作用域就是變數和函式的可訪問範圍,控制著變數和函式的可見性與生命週期,在JavaScript中變數的作用域有全域性作用域和區域性作用域。 作用域鏈是當程式碼在一個環境中執行時,會建立變數物件的一個作用域鏈(scope chain,不簡稱sc)來保證對執行環境有權訪問的變數和函式的有序訪問。作用域第一個物件始終是當前執行程式碼所在環境的變數物件(VO)

相關文章