JavaScript函數內部屬性arguments

JavaScript高級程序設計(第三版),我的的讀書筆記. node

在JS函數內部,有兩個特殊的對象:arguments和this,咱們先講下arguments。 數組

arguments是一類數組對象,包含着輸入函數中的全部參數。除此以外還有一個callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。 函數

舉一個階乘的例子文件命名爲factorial.js(在nodejs下檢驗js輸出結果): this

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

//一樣效果的:
function factorial(num) {
	if(num <= 1) {
		return 1;
	}else{
		return num * arguments.callee(num-1);
	}
}

這種寫法主要爲了函數的解耦,重寫的函數,不管引用函數時使用的是什麼名字,均可以保證正常的完成遞歸調用。 spa

看下面兩段代碼的執行結果: 設計

//第一段代碼
function factorial(num) {
	if(num <= 1) {
		return 1;
	}else{
		return num * factorial(num - 1);
	}
}

var trueFactorial = factorial;
factorial = function() {
	return 0;
}

console.log(trueFactorial(5));
console.log(factorial(5));

//運行結果是
//0
//0
變量trueFactorial獲取了factorial值,實際上實在另外一個位置上保存了一個函數的指針,而後咱們又將簡單的返回0的函數複製給factorial變量.因此在trueFactorial執行時,內部的factorial已是被重寫了.因此輸出0 0結果~
//第二段代碼
function factorial(num) {
	if(num <= 1) {
		return 1;
	}else{
		return num * arguments.callee(num-1);
	}
}

var trueFactorial = factorial;
factorial = function() {
	return 0;
}

console.log(trueFactorial(5));
console.log(factorial(5));

//運行結果是:
//120
//0

函數只是會調用自身,後面的變量複製的函數不會去覆蓋掉factorial的中的調用,因此運行結果是咱們想要的. 指針

相關文章
相關標籤/搜索