定義函式的方式有兩種:一種是函式宣告,另一種是函式表示式
函式宣告語法格式如下:
function functionname(arg0,arg1,arg2)
關於函式宣告,有乙個重要的特徵就是函式宣告提公升,意思是在執行**之前會先讀取函式宣告
函式表示式語法格式如下:
var
functionname
=function(arg0,arg1,arg2)
遞迴函式是乙個函式通過名字呼叫自身情況構成的
經典的遞迴函式
function
factorial
(num)
else
} console.
log(
factorial(3
))
但是下列**會導致它出現問題
var anothe***ctial=factorial;
factorial=
null
;console.
log(
anothe***ctial(4
))
此時解決的方法有兩個
//方法一:
function
factorial
(num)
else
}//但是嚴格模式下不能通過指令碼訪問arguments.callee,故可以使用方法二更加保險
//方法二:
var factorial=
(function
f(num)
else
})
閉包是指有權訪問另乙個函式作用域的變數的函式,常見的建立閉包的常見方式,就是在乙個函式內部建立另有乙個函式
function
createcomparisionfunction
(propertyname)
else
if(value1>value2)
else
}}
閉包的執行過程:某個函式被呼叫時,會建立乙個執行環境及相應的作用鏈域。然後使用arguments和其他命名引數的值來初始化函式的活動物件,但在作用域中,外部函式活動物件始終處於第二位,外部函式的外部函式的活動物件處於第三位…知道作用鏈域終點的全域性執行環境。
下面來討論一下函式執行完畢後閉包域其他普通函式的不同之處
普通函式:區域性活動物件會被銷毀,記憶體中儲存全域性作用域
閉包:外部執行環境的作用鏈域會被銷毀,但是活動物件任然會留在記憶體,直到匿名函式被銷毀
閉包只能取得包含函式中任何變數的最後乙個值
閉包儲存著的是整個變數物件,而不是某個特殊的函式
function
createfunctions()
}return result
}var funcs =
createfunctions()
;for
(var i=
0; i < funcs.length; i++
)
但是,我們樂意建立另乙個匿名函式強制讓閉包的行為符合預期
在這裡插入**片
函式表示式
函式定義有以下兩種方式 一種是函式宣告,一種是函式表示式。函式宣告 在執行 之前會先讀取函式宣告,即函式宣告提公升。函式表示式 常用語法形式是常規的變數賦值語句,即建立乙個匿名函式並賦值給乙個變數。函式表示式在使用之前必須賦值,否則會出錯,這點與函式宣告提公升不同。能夠將匿名函式作為其他函式的值進行...
函式表示式
函式表示式在使用前必須先賦值。函式表示式,使用前必須先賦值var functionname function arg0,arg1 匿名函式或拉姆達函式 arguments.callee 是乙個指向正在執行的函式的指標,因此可以用它來實現對函式 的遞迴呼叫,function factorial num...
JS函式表示式
1.遞迴 function digui num else var d digui digui null d 3 改進 用arguments.callee num 1 代替 digui num 1 arguments.callee 是指向引數所在的函式的指標,code如下 function digui...