一、函数声明和函数表达式的区别:
- 函数声明放在if——else语句中,在IE8中会出现问题
- 函数表达式则不会
<script>
if(true){
function f1(){
console.log("我是第一个函数");
}
}else{
function f1(){
console.log("我是第二个函数");
}
}
f1();//我是第一个函数
f1();//我是第二个函数(IE8)
//函数声明的函数,放在if--else语句中,在IE8中显示的不一样
//但是当使用函数表达式的方法,却不会
if(true){
var f2=function(){
console.log("我是第一个函数");
}
}else{
var f2=function (){
console.log("我是第二个函数");
}
}
f2();//我是第一个函数
</script>
二、函数中的this指向的问题
- 普通函数中的this------------window
- 定时器中的this---------------window
- 构造函数中的this------------实例对象
- 对象。方法中的this----------当前的实例对象
- 原型方法中的this----------实例对象
- 严格模式下的this-----------undefined
<script>
//1.普通函数中的this------------window
function f1(){
console.log(this);
}
f1();//Window
//2.定时器中的this---------------window
setInterval(function(){
console.log(this);//Window
},1500)
//3.构造函数中的this------------实例对象
//4.对象。方法中的this----------当前的实例对象
//5.原型方法中的this----------实例对象
function Person(){
this.name=name;
this.show1=function(){
console.log(this);
}
}
Person.prototype.show2=function(){
console.log(this);
}
var per=new Person("小明");
per.show1();//Person {name: "", show1: ƒ}
per.show2();//Person {name: "", show1: ƒ}
//6.严格模式下的this-----------undefined
function f2(){
"use strict";
console.log(this);
}
f2();//undefined
</script>
三、函数不同的调用方式
- 普通函数-------直接函数名()
- 构造函数-------通过new来调用,创建对象
- 对象方法------点语法,对象.方法调用
四、函数也是对象,对象不一定是函数
- 函数有prototype原型,是对象,对象中有__proto__,原型是对象
- 如果一个对象里面有prototype又有__proto__,既是原型也是对象
- Math是对象,但是没有__proto__,不是函数
- 所有的函数实际上都是Function的构造函数创建出来的实例对象
五、数组中的函数调用(forEach)
<script>
var arr=[
function f1(){console.log("f1函数")},
function f2(){console.log("f2函数")},
function f3(){console.log("f3函数")},
function f4(){console.log("f4函数")}
];
arr.forEach(function(ele){
ele();//f1函数 f2函数 f3函数 f4函数
});
</script>