WEB开发(二)—— 函数

刘秀梅
刘秀梅   编辑于 2018-10-11 15:18
阅读量: 1465

(一)函数三要素

函数的三要素为函数名、参数(形参,实参),返回值。

(二)函数定义与调用

函数定义的关键字为function,不能省略,也不要能简写。定义函数有3种形式,相应的调用形式有2种。

1.函数声明形式

 

注: 不需要在函数声明的后面添加一个分号,并且添加一个分号完全是浪费性能。大括号是函数声明的必须的语法元素之一,同时它也是一个复合语句,可以用来组织语句,右侧的花括弧( } )本身就意味着复合语句的结束,所以不用添加分号,如果添加分号的话,就相当于重新建立了一个空语句。

2.函数表达式形式

所以一般写成下列形式:

注: 函数表达式和声明变量原理相同,只不过变量的值是一个函数对象,这个时候就建议使用分号结尾。

3.匿名函数

匿名函数需要立即调用或者立即赋值给一个变量,上述代码为立即调用,而函数表达式为匿名函数立即赋值给一个变量的形式,事件也是。

(三)匿名函数
     匿名函数为什么要加一对小括号呢?这样使用有什么好处么?

1.在function前面加!、+、 - 甚至是逗号等到都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式,消除了javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。

2.函数是有返回值的,返回我们指定的值或者undefined。函数的返回值我们可能需要在后续中使用。在函数前面加上不同的运算符,这些运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。在这些运算符中加括号是最安全的做法,因为它不会改变函数的返回值。

至此,我们回答了第一个问题。接下来我们回答第二个问题:匿名函数的好处。

javascript中没用私有作用域的概念,在ES5中只用全局作用域和局部作用域。在函数内通过var关键字声明的变量为局部变量。如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉。那么我们可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

jQuery使用的就是这种方法,将jQuery代码包裹在 ( function (window,undefined){…jquery代码…} (window))中,在全局作用域中调用jQuery代码时,可以达到保护jQuery内部变量的作用。

(四)函数声明与函数表达式
通过前面代码我们知道函数声明与函数表达式两种定义方式的调用形式是一样的, 那么这两种定义方式有什么不同呢?

1.变量提升

首先JavaScript引擎在读取JavaScript代码时会进行两个步骤,第一个步骤是释,第二个步骤是执行。 
所谓解释就是会先通篇扫描所有的JavaScript代码,然后把所有声明提升到顶端,第二步是执行,执行就是操作一类的。

所有声明提升到顶端的意思是把变量声明提升到变量作用域(全局或者函数)的顶端。

变量提升只有变量声明提升,而变量赋值留在原地。所以书写代码要养成好的习惯,先声明后使用。特别的注意函数声明和函数表达式的不同点。

2.关于return语句

我们知道return语句有两个作用,第一个是返回指定的值,第二个是结束函数的执行,写在return语句后面的代码不会执行。

另外了解到JavaScript代码运行分两步:第一是提升变量,第二是执行JavaScript语句。

这两个知识点结合在一起,我们看下列代码:

调用add(1,2) 语句执行结果为:

我们看到add函数运行时没有报错,并且只有第一个console.log(c)执行,且输出为undefined。
结果分析:因为第一步为变量提升,所以相当于为如下代码:

在第二步add函数代码运行到第一个console.log(c)时,变量c已经声明但是没有赋值,所以输出undefined,而return语句后面的c=5;console.log(c)语句不会被执行。

注:如有疑问,欢迎指正

收藏 转发 评论 4
6-闫昆 回复 6-安佳

膜拜大佬

6-安佳

emmmmm,果然有点东西

刘秀梅

嗯 好的

fishtai0

文章中的代码,如果可以请尽量使用编辑器中的代码工具插入进来,代码截图可能不太好。