A-A+

JavaScript函数声明和函数表达式

2016年10月16日 web前端设计 暂无评论 阅读 6 views 次

小编来给大家简单介绍JavaScript函数声明和函数表达式用法,有需要的朋友可参考。

JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的,通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递,在继续讲述之前,先看一下函数的使用语法:

  1. function func1(…){…}  
  2. var func2=function(…){…};  
  3. var func3=function func4(…){…};  
  4. var func5=new Function();  

另外还有一种自执行函数表达式,主要用于创建一个新的作用域,在此作用域内声明的变量,不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,且立即自动执行,代码如下:

  1. (function () {   
  2. // var x = ...   
  3. })();  

此种自执行函数表达式归类于以上两种方法的第二种,也算是函数表达式,方法一和方法二都创建了一个函数,且命名为 foo,但是二者还是有区别的,JavaScript 解释器中存在一种变量声明被提升(hoisting)的机制,也就是说变量(函数)的声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面,例如以下代码段:

  1. alert(foo); // function foo() {}   
  2. alert(bar); // undefined   
  3. function foo() {}   
  4. var bar = function bar_fn() {};   
  5. alert(foo); // function foo() {}   
  6. alert(bar); // function bar_fn() {}  

输出结果分别是function foo() {}、undefined、function foo() {}和function bar_fn() {},可以看到 foo 的声明是写在 alert 之后,仍然可以被正确调用,因为 JavaScript 解释器会将其提升到 alert 前面,而以函数表达式创建的函数 bar 则不享受此待遇,那么bar 究竟有没有被提升呢,其实用 var 声明的变量都会被提升,只不过是被先赋值为 undefined 罢了,所以第二个 alert 弹出了 undefined,所以,JavaScript 引擎执行以上代码的顺序可能是这样的:创建变量 foo 和 bar,并将它们都赋值为 undefined,创建函数 foo 的函数体,并将其赋值给变量 foo,执行前面的两个 alert,创建函数 bar_fn,并将其赋值给 bar,执行后面的两个 alert。

注:严格地说,再 JavaScript 中创建函数的话,还有另外一种方法,称为“函数构造法”,代码如下:

var foo = Function('alert("hi!");');

此方法以一个字符串作为参数形成函数体。但是用这种方法,执行效率方面会打折扣,代码如下:

var funcName=new Function(p1,p2,,pn,body);

参数的类型都是字符串,p1到pn表示所创建函数的参数名称列表,body表示所创建函数的函数体语句,funcName就是所创建函数的名称。可以不指定任何参数创建一个空函数,不指定funcName创建一个无名函数,当然那样的函数没有任何意义。

需要注意的是,p1到pn是参数名称的列表,即p1不仅能代表一个参数,它也可以是一个逗号隔开的参数列表,例如下面的定义是等价的,代码如下:

new Function("a", "b", "c", "return a+b+c")

new Function("a, b, c", "return a+b+c")

new Function("a,b", "c", "return a+b+c")

JavaScript引入Function类型并提供new Function()这样的语法是因为函数对象添加属性和方法就必须借助于Function这个类型。

标签:

给我留言