JS函数

xiaoxiao2021-02-28  85

一、传统的函数声明与函数定义

函数声明:写前面,避免用的时候不认识该函数:

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());     // 正确

                   为什么错误?

                                    

;

转载请注明原文地址: https://www.6miu.com/read-82696.html

最新回复(0)