函數聲明和函數表達式有什么區別?
function foo(){} ? ??函數聲明
var f = function foo(){}; ?函數表達式
new function foo(){}; ? ? ?函數表達式,因為它是NewExpression表達式
(function (){
function foo(){}; ? ? ? ? ? ? ?函數聲明,是函數體的一部分
}) ();
(function foo(){}); ? ? ? ? ?函數表達式,因為它被包含在分組操作符中,分組操作符只能包含表達式
簡單來說,如果function foo(){}作為賦值表達式的一部分,則其為函數表達式,如果function foo(){}被包含在函數體內,或者處于程序的最上層,則認為它是函數聲明。
兩者的異同:
函數聲明會在任何表達式被解析和求值之前先被解析求值;而表達式是遇到再算。
什么是變量的聲明前置?什么是函數的聲明前置
變量的聲明前置就是無論變量的聲明在程序什么位置出現,都將它置于初始的位置。
函數聲明前置是指將函數的聲明置于初始位置,但是在變量聲明之后。
上述代碼執行后會出現function和1,因為實際相當于
arguments 是什么
arguments是函數的參數集合,用于獲取參數數組,也可用于函數重載。
函數的重載怎樣實現
function sum(a,b,c){
? ? var ?sum =0;
? ?for (var i =0; i<arguments.length; i++){
sum += arguments[i];
? ? }
return sum;
}
上述函數是一個重載的求和函數。
立即執行函數表達式是什么?有什么作用
(function sum(){})();
(function(){})(); ? ? ?匿名函數
可以讓函數在定義后直接調用,作用是在固有的作用域內使用,不會污染全局變量
什么是函數的作用域鏈
全局作用域,就是在函數外聲明或者在函數內部未加var的變量都存在與全局作用域。
局部作用域,就是在函數內部可以訪問到的作用域。
作用域鏈就是函數在使用過程中,會查找相應的變量或函數聲明,首先是在當前作用域查找,之后開始逐級向上查找,這就形成了作用域鏈。
代碼
1.
2.
3.因為變量聲明前置,所以a是未定義,而b沒有聲明,所以報錯
4.實際的執行順序如下,所以輸出helloworld和sayAge未聲明
5.
實際執行路線
6.因為實際的執行順序是
7.因為fn是1不是函數所以報錯
8.因為聲明前置,所以前兩項未初始化,后兩項循環后得10,100,這里有個問題,i,j的變量聲明不是在for循環里面的嗎,應該是局部變量才對呀,所以如果是局部變量的話,是不是前兩個應該報錯才對?是因為語句寫的變量(不在函數內)所以都是全局變量嗎?
9.實際順序如下
10.函數輸出10-2,運行后銷毀,之后輸出0
版權歸ENVY和饑人谷所有,轉載請注明出處