函数声明和函数表达式的区别

函数声明和函数表达式的区别 javascript

1.      函数声明(function sayHello(){}):代码执行以前,解析器就已经读取函数声明并将其添加到执行环境中,所以以下代码运行正常:html

 

sayHello(); java

function sayHello() web

{ 函数

    alert( ' Hello ' ); post

} 性能

 

 

2.      函数表达式(var sayWorld = function(){}):这个会产生运行错误,缘由在于函数位于一个初始化语句中,而不是一个函数声明,换句话说,在执行到函数所在语句以前,变量sayWorld不会保存对函数引用。测试

 

sayWorld();
var sayWorld = function ()
{
    alert('World');
}
 
 
原文引用以下:

javascript笔记:深刻理解javascript的function

Functionjavascript里最经常使用的一个概念,javascript里的function是最容易入手的一个功能,但它也是javascript最难理解最难掌握的一个概念。this

1、个人第一个javascript代码url

1 function test()
2 {
3     alert( ' Hello World! ' );
4 }   
5 window.onload = test(); // Hello World!

界面加载时候就会弹出写有“Hello World!”的对话框。我对function的第一印象就和java里面方法没啥区别了。可是当我看到这样的代码我就晕乎乎了。

复制代码
1 function test(num)
2 {
3 return function ()
4     {
5 if (num > 0 )
6         {
7 return ' 正数 ' ;
8         } else if (num < 0 )
9         {
10 return ' 负数 ' ;
11         } else {
12 return ' ' ;
13         }
14     }
15 }   
16 window.onload = alert(test( 11 )()); //
复制代码

2、javascript里面定义函数的方法

1.       函数声明

复制代码
1 function sum(a,b)
2 {
3 return a + b;
4 }   
5
6 alert(sum( 10 , 20 )); // 30
复制代码

2.       函数表达式

复制代码
1 var sum = function (a,b)
2 {
3 return a + b;
4 };
5
6 alert(sum( 10 , 20 )); // 30
复制代码

3.       使用Function构造函数

1 var sum = new Function( " a " , " b " , " return a+b " );
2 alert(sum( 10 , 20 )); // 30

  以上三种均可以定义一个函数目的。大多数javascript书籍里面不推荐使用第三种,缘由第三种存在严重的性能问题,这种定义会解析两次代码,第一次是常规的解析这条语句,第二次要把函数里的字符串解析成实际的函数,可是它却传达了javascript的函数实际上是对象(object,而函数名是指向对象的指针

    所以我以为理解函数function的关键把它看成对象objectJavascript对象存储的方式:

   Javascript数据是存在栈内存(stack)和堆内存(heap),堆内存存储javascript对象的具体内容,而栈内存存储对象的地址,下面的代码:

  

1 var ftn = function (){alert(‘hi’)};

 

ftn存储在栈内存,function(){alert(‘hi’)};存储在堆内存里面,ftn的记录的是function(){alert(‘hi’)};在堆内存的地址。所以下面的代码:

1 alert(ftn); // var ftn = function(){alert(‘hi’)};

弹出框显示的是function的所有定义。若是代码以下:

ftn()//hi

结果就是hi了。(通常执行函数,能够在函数名后面加上括号,传入须要传入的参数)。

3、javascript里面没有函数重载

复制代码
1 function sum(num)
2 {
3 return num + 10 ;
4 }   
5 function sum(num)
6 {
7 return num + 30 ;
8 }
9 alert(sum( 10 )); // 40
复制代码

后面定义的方法会覆盖前面的方法,若是咱们理解了“javascript的函数实际上是对象(object,而函数名是指向对象的指针”,这个就很好理解了,上面的写法能够改写为:

复制代码
1 var sum = function (num)
2 {
3 return num + 10 ;
4 }   
5 sum = function (num)
6 {
7 return num + 30 ;
8 }
9 alert(sum( 10 )); // 40
复制代码

4、函数声明和函数表达式的区别

两个的定义见本文的条目二。对于这两种方式的区别我在上一篇文章里作过测试,我以为个人猜想仍是颇有道理,不过这里我仍是要提供一些权威的说法:

1.       函数声明(function ftn(){}):代码执行以前,解析器就已经读取函数声明并将其添加到执行环境中,所以以下代码运行正常:

1 sayHello();
2 function sayHello()
3 {
4     alert( ' Hello ' );
5 }

2.(代码以下)函数表达式(var ftn = function(){}):这个会产生运行错误,缘由在于函数位于一个初始化语句中,而不是一个函数声明,换句话说,在执行到函数所在语句以前,变量sayHello不会保存对函数引用。

1 sayHello();
2 var sayHello = function ()
3 {
4     alert( ' Hello ' );
5 }

5、函数能够当作值使用

函数名是变量,因此函数能够看成值来用,所以我开头写的那个代码就能够理解了,那是把函数做为返回值。用过jQuery的人都会知道:$(document).ready(function(){}),这就是典型的把函数看成参数使用了。

 


相关文章
相关标签/搜索