1.函数提升:
对于函数,只有函数声明会被提升到顶部,而不包括函数表达式。
/* 函数声明 */
foo(); // "bar"
function foo() {
console.log("bar");
}
/* 函数表达式 表达式定义的函数,称为匿名函数。匿名函数没有函数提升。*/
baz(); // TypeError: baz is not a function
//此时的"baz"相当于一个声明的变量,类型为undefined。
由于baz只是相当于一个变量,因此浏览器认为"baz()"不是一个函数。
var baz = function() {
console.log("bar2");
};
注意:表达式定义的函数,称为匿名函数,匿名函数没有函数提升
2.apply()方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或
类似数组的对象)提供的参数:
fun.apply(thisArg, [argsArray])
参数:
thisArg:
在 fun
函数运行时指定的 this
值。
需要注意的是,指定的 this
值并不一定是该函数执行时真正的 this
值,如果这个函数处于[非严格模式下]则指定为 null
或 undefined
时会自动指向
全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this
会指向该原始值的自动包装对象。
argsArray:
一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 fun
函数。如果该参数的值为null
或 [undefined
]则表示不需要传入任何参数。
例子:
//高阶函数
//这个高阶函数返回一个新的函数,这个函数将他的实参传入f()
//并返回f的返回值的逻辑非
function not(f){
return function(){
var result = f.apply(this,arguments);//调用f()
console.log(this); //window
return !result;//对结果进行求反
}
}
var even = function(x){//判断x是否为偶数的函数
return x % 2 === 0;
}
var odd = not(even);//一个新函数,所做的事情和even()相反
[1,,1,3,5,7,9].every(odd);
var result = f.apply(this,arguments);//调用f()
这里的this如果换做null或者undefined,this也是指Window