JavaScript-関数式

1731 ワード

定義
関数を定義する方法は二つあります.一つは関数宣言です.
function functionName(agr0, arg1, arg2){
	//body
}
関数宣言の昇格は、コードを実行する前に関数宣言を先に読み、その呼び出し文の後に関数宣言を置くことができることを意味します.
sayHi();

function sayHi() {
	alert("Hi!");
}
もう一つは関数式です.
var functionName = fuction(arg0, arg1, arg2)
{
	//body
}
関数式は他の表式と同じです.使う前に値を先に与えなければなりません.
再帰する
再帰の関数には小さいissueがあります.
<script type="text/javascript">

function factorial(num) {
	if (num <= 1) {
		return 1;
	} else {
		return num * arguments.callee(num - 1);
	}
}

var anotherFactorial = factorial;
factorial = null;

alert(anotherFactorial(4));

</script>
包みを閉じる
<script type="text/javascript">

function createComparisonFunction(propertyName) {

	return function(object1, object2) {
		var value1 = object1[propertyName];
		var value2 = object2[propertyName];

		if(value1 < value2)
		{
			return -1;
		}
		else if(value1 > value2)
		{
			return 1;
		}
		else
		{
			return 0;
		}
	}
}
</script>
関数が最初に呼び出された時に、実行環境と対応する作用ドメインチェーンを作成し、作用ドメインチェーンの値を特殊な内部属性に与え、次にthis、argmentsと他のネーミングパラメータの値を使って関数の活動オブジェクトを初期化します.
<script type="text/javascript">
	function compare(value1, value2) {
		if (value1 < value2) {
			return -1;
		} else if (value1 > value2) {
			return 1;
		} else {
			return 0;
		}

	}

	var result = compare(5, 10);
</script>
関数で変数にアクセスすると、その名前の変数がscopeから検索されます.一般的には、関数の実行が完了すると、部分的な活動対象は破棄されます.メモリにはグローバルスコープのみを保存します.クローズドの場合はもちろん違います.関数が実行された後、活動対象は破壊されません.匿名関数の作用ドメインチェーンはまだこの活動対象を引用しています.ただ、匿名関数が破壊されるまでは、関数の活動対象は破棄されます.
ブロックレベルのスコープを模倣する
(function() {})();