Function 类型
function类型,毋庸置疑是js中相当重要的一个玩意。
1.这玩意首先是一个对象,也就是说它是一个引用类型。陈述:一听说是对象,是不是很有一种它的基类是object对象错觉感,No,
它和object是独立的2个东西。当你typeof function 时,返回的是 funciton 并非 object
2.每个函数都是 Function 对象的一个实例,它与其他引用对象一样具有属性和方法。由于它是对象所以函数名是指向函数对象的指针
关于函数的声明的语法支持:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16<script>
//方式1
function
fun(num1,num2){
return
num1+num2;
}
//方式2
var
fun=
function
(num1,num2){
return
num1+num2;
};
//方式3
var
fun=
new
Function(
"n1"
,
"n2"
,
"return n1+n2"
);
</script>
讲解:3种方式都能完成一个函数的声明,但各有不同。
方式1 理解为 一个函数的声明,方式2,方式3理解为函数表达式。(方式3不推荐使用,原因会导致解析2次代码,先解释常规ECMAScript代码,在解释传入的参数,这种
写法,参数可以是N个,但是最后一个参数视为函数主体)
为什么说不同,主要在于,js解析器对函数声明 和 函数表达式 解析的不同。解析器会优先读取函数申明,js引擎在执行时会将函数声明自动放到执行环境的最顶端。
而函数表达式则不同,当执行到函数表达式时,才会真正去被解释执行。关于这点理解很重要!
看代码
?
1 2 3 4 5 6 7 8 9 10 11 12<script>
console.log(
typeof
fun);
//"function"
console.log(
typeof
fun2);
//"undefined"
console.log(
typeof
fun3);
//"undefined"
function
fun(n1,n2){
return
n1+n2;
}
var
fun2=
function
(n1,n2){
return
n1+n2;
}
var
fun3=
new
Function(
"n1"
,
"n2"
,
"return n1+n2;"
);
</script>
3.为什么函数没有重载?
这个问题要从js的语言特性来考虑。在第2条已经说了,函数名称只是指向函数对象的一个指针。根据指针的概念去理解就清楚了。
看代码示例:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<script>
function
fun(n1){
return