1.函數(shù)提升:
對于函數(shù),只有函數(shù)聲明會被提升到頂部,而不包括函數(shù)表達式。
/* 函數(shù)聲明 */
foo(); // "bar"
function foo() {
console.log("bar");
}
/* 函數(shù)表達式 表達式定義的函數(shù),稱為匿名函數(shù)。匿名函數(shù)沒有函數(shù)提升。*/
baz(); // TypeError: baz is not a function
//此時的"baz"相當(dāng)于一個聲明的變量,類型為undefined。
由于baz只是相當(dāng)于一個變量,因此瀏覽器認為"baz()"不是一個函數(shù)。
var baz = function() {
console.log("bar2");
};
注意:表達式定義的函數(shù),稱為匿名函數(shù),匿名函數(shù)沒有函數(shù)提升
2.apply()方法調(diào)用一個函數(shù), 其具有一個指定的this值,以及作為一個數(shù)組(或
類似數(shù)組的對象)提供的參數(shù):
fun.apply(thisArg, [argsArray])
參數(shù):
thisArg:
在 fun 函數(shù)運行時指定的 this 值。需要注意的是,指定的 this 值并不一定是該函數(shù)執(zhí)行時真正的 this 值,如果這個函數(shù)處于[非嚴格模式下]則指定為 null 或 undefined 時會自動指向全局對象(瀏覽器中就是window對象),同時值為原始值(數(shù)字,字符串,布爾值)的 this 會指向該原始值的自動包裝對象。
argsArray:
一個數(shù)組或者類數(shù)組對象,其中的數(shù)組元素將作為單獨的參數(shù)傳給 fun函數(shù)。如果該參數(shù)的值為null
或 [undefined]則表示不需要傳入任何參數(shù)。
例子:
//高階函數(shù)
//這個高階函數(shù)返回一個新的函數(shù),這個函數(shù)將他的實參傳入f()
//并返回f的返回值的邏輯非
function not(f){
return function(){
var result = f.apply(this,arguments);//調(diào)用f()
console.log(this); //window
return !result;//對結(jié)果進行求反
}
}
var even = function(x){//判斷x是否為偶數(shù)的函數(shù)
return x % 2 === 0;
}
var odd = not(even);//一個新函數(shù),所做的事情和even()相反
[1,,1,3,5,7,9].every(odd);
var result = f.apply(this,arguments);//調(diào)用f()
這里的this如果換做null或者undefined,this也是指Window