自定義函數(shù)實現(xiàn)sort排序(排查詭異默認排序)
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;
}
};
}
//demo
var data = [{name: "Zachary", age: 28}, {name: "Nicholas", age: 29}];
data.sort(createComparisonFunction("name"));
alert(data[0].name); //Nicholas
data.sort(createComparisonFunction("age"));
alert(data[0].name); //Zachary
函數(shù)內(nèi)部屬性
在函數(shù)內(nèi)部征峦,有兩個特殊的對象:arguments 和 this
//階乘算法
function factorial(num){
if (num <=1) {
return 1;
} else {
return num * factorial(num-1)
}
}
//arguments.callee() 已經(jīng)廢棄不太推薦使用
function factorial(num){
if (num <=1) {
return 1;
} else {
return num * arguments.callee(num-1)
}
}
ECMAScript 5 也規(guī)范化了另一個函數(shù)對象的屬性:caller蒲稳。除了 Opera 的早期版本不支持寄狼,其他瀏覽器都支持這個 ECMAScript 3 并沒有定義的屬性。這個屬性中保存著調(diào)用當前函數(shù)的函數(shù)的引用荚板,如果是在全局作用域中調(diào)用當前函數(shù)沃琅,它的值為 null荚藻。例如:
function outer(){
inner();
}
function inner(){
alert(inner.caller);
}
//outer();
function outer(){
inner();
}
function inner(){
alert(arguments.callee.caller);
}
//outer();
IE、Firefox邪财、Chrome 和 Safari 的所有版本以及 Opera 9.6 都支持 caller 屬性陕壹。
當函數(shù)在嚴格模式下運行時,訪問 arguments.callee 會導致錯誤树埠。ECMAScript 5 還定義了arguments.caller 屬性糠馆,但在嚴格模式下訪問它也會導致錯誤
函數(shù)屬性和方法
ECMAScript 中的函數(shù)是對象,因此函數(shù)也有屬性和方法怎憋。每個函數(shù)都包含兩個屬性:length 和 prototype又碌。length 屬性表示函數(shù)希望接收的命名參數(shù)的個數(shù),如下面的例子所示绊袋。
function sayName(name){
alert(name);
}
function sum(num1, num2){
return num1 + num2;
}
function sayHi(){
alert("hi");
}
alert(sayName.length); //1
alert(sum.length); //2
alert(sayHi.length); //0
call()方法與 apply()方法的作用相同毕匀,它們的區(qū)別僅在于接收參數(shù)的方式不同。對于 call()方法而言癌别,第一個參數(shù)是 this 值沒有變化期揪,變化的是其余參數(shù)都直接傳遞給函數(shù)。換句話說规个,在使用
call()方法時凤薛,傳遞給函數(shù)的參數(shù)必須逐個列舉出來