這次帶給大家深入分析JS函數,函數宣告和函數表達式有什麼不同?使用JS函數的注意事項有哪些,以下就是實戰案例,一起來看一下。
函數宣告和函數表達式有什麼不同(*)
函數宣告: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 是什麼 (*)
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)
以上是深入分析JS函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!