一、传统的函数声明与函数定义
函数声明:写前面,避免用的时候不认识该函数:
Int add(int a,int b);
函数定义:要实现函数:
Int add(inta,int b)
{
Return a+b;
}
而对于JS,有变量名提升和函数声明提升的机制,不需要传统意义上的写在最前面的函数定义。
JS只有函数声明和函数表达式。(JS的函数声明像其他语言的函数定义)
二、当函数没有返回值时,它其实是返回undefined
{ {
…… ------》 ……
} return;
}
系统会自动加一句return;其实返回了undefined。
三、JS中经典的函数定义方法:(用函数表达式定义函数)
Var expressFunc = function(){};
其中function应该是个关键字
对比其他语言的函数表达式:
Inta = func_name(); // 变量a获得函数的返回值
应该可以这样理解:
对于JS表达式,有两种:带function关键字和不带function关键字
1. var a = func_a();
执行func_a函数,并将返回值赋值给变量a.
2. var expressFunc = function(){};
带了function关键字,则这是一个函数表达式,变量expressFunc应该不再是函数的返回值,而是类似指针的东西,指向该函数,后面可以这样使用:
expressFunc(); // 调用函数
只能理解为指针,而不是函数名,因为这其实是个表达式,将匿名函数赋值给变量,不匿名直接在function后面加个名字也行的,如:
Var expressFunc = function func_name(){};
调用时可以用:
1. expressFunc();
2. func_name();
四、对混乱语法的整理
1. Function(){}
2. Function func1(){}
3. Var func2 = function(){};
4. Var func3 = functionfunc_name(){};
5. Var func4 = new Function();;
第5种声明func4为一个对象,暂时不懂,先讨论前4种:
1.和2.是函数声明,3.和4.是函数表达式,只不过是匿名和有名的区别
五、函数定义的两种方法
1. 函数声明
Function func1(){}
2. 函数表达式(要不要函数名都可以)
Var func2 = function(){};
Var func3 = function func_name(){};
调用方法:
Func1();
Func2();
Func3();
Func_name();
## 区别
1. 函数声明会提升,函数表达式不会
在执行代码前会先读取函数声明,所以可以吧函数声明放在调用的后面。而函数表达式在使用前必须先赋值。
举例:
(1) 用函数声明定义
sayHi();
FunctionsayHi()
{
Alert(“ hi ”); // 不会报错
}
(2) 用函数表达式定义
sayHi();
var sayHi = function(){ alert(“ hi ”); };
// 报错
2. 函数声明后面不能跟圆括号,表达式可以
要将函数声明转成函数表达式,只需再给函数声明加一对圆括号即可:
(function(){});
自己的测试:
(1)
Function func_a(){
alert(“哈哈”);
}
Var a =func_a();
结果:弹出对话框“哈哈”。执行func_a函数,将返回值赋值给变量a,如果再用一个alert输出a,结果也是输出undefined.
(2)
变量名代表声明?
Function func_a(){ alert(“哈哈”); }
Var a =func_a;
alert(a);
结果:不执行func_a函数本身,只弹出一个对话框,内容竟然是函数的定义Function func_a(){ alert(“哈哈”); }
因此,要执行函数,还是要带()。
六、关于所谓提升
JS只有函数声明提升和变量提升。
比如五、##区别中的例子:
(1)
sayHi();
FunctionsayHi()
{
Alert(“ hi ”); // 不会报错
}
会发生函数声明提升,即系统会读成:
FunctionsayHi()
{
Alert(“ hi ”); // 不会报错
}
sayHi();
结果当然正确。
(2)
sayHi();
var sayHi = function(){
alert(“ hi ”);
};
会发生变量提升,系统会读成:
VarsayHi;
sayHi();
var sayHi = function(){
alert(“ hi ”);
};
结果当然不正确。
本质:用函数声明创建的函数可以在函数解析后调用。
用函数表达式创建的函数是在运行时进行赋值,且要等到表达式赋值完成后才能 调用。
七、事件调用函数
重点只能先记住(暂不知道为什么):
1. 在html标签中,事件属性要用函数表达式(带引号):
<body onload = “checkCookies()”>
2. 在JS代码中,事件属性要用函数声明:
XXX.onclick = function(){
……
};
按自己纠结的两个例子推导出的这样的用法:
1. JS实现动画
d.onmouseover = function(){ startOut(); } // 可以正确实现
d.οnmοuseοver= startOut(); // 不行,直接自动执行一次,此后无法触发事件
2. 博客中的例子
(1)<a onclick = “(function(){alert(“a”);})()” //正确,其实是将函数声明转成表达式
(2)<a onclick = “function(){alert(“a”);}”> //错误
(3)<scripttype = ”text/javascript”>
Vara3 = document.getElementById(“a3”);
a3.οnclick= function(){alert(“a”);}; // 正确
##标签中赋值什么时候要引号,忘记了
八、不懂的句子
1. 以函数表达式的方式定义函数,函数的名称是可选的。如果定义了函数名称,这时函数名会变成函数内部的一个局部变量,非常适合用于递归。函数表达式定义特别适合只会用到一次的函数。
2. Var myobject = {
Value : 0;
Inc : function(){
Alert(this.value):
}
}
此时this指向myobject.
什么时候不指向?闭包?函数内套函数?apply?
3. JS函数表达式可以包含名称,实际是将函数的结果赋值给expressTest:
Var expressTest = function evalu(test){
If(test)
Return2;
Else
Return-1;
}
Console.log(evalu()); // 错误的调用方式
Console.log(expressTest()); // 正确
为什么错误?
;
