Javascript函数入门

在JavaScript世界中,函数也许是最重要的一个概念,我们经常听到一个说法:函数是JavaScript的一等公民。

Javascript中函数是什么

为完成某一功能的程序指令(语句)的集合,称为函数。

  1. 函数是被调用时执行的可重复使用的代码块
function fun1(x)
{
	console.log(x);
}
fun1(1);
fun1(2);
  1. 函数是对象。上一节我们说了Javascript中一切皆是对象,函数也是对象。
  2. 在JavaScript中可以使用function关键字来定义一个“类”。
  3. JavaScript没有重载(overload)

定义函数的方法

1、函数声明 : function 函数名(){}

function functionName(parameter1, parameter2, parameter3) {
    //执行的代码
}

  • 函数声明必须有函数名,函数本身是对象,函数名是指针,指向函数主体。
  • 函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。
  • 函数声明仅仅可以出现在全局中,或者嵌套在其他的函数中
  • -这种方法声明的函数,是具名函数。
  • 常规的调用方法是:函数名(参数),如果后面不跟随小括号,返回函数体,有小括号表示执行函数体。
  • 执行函数体(调用)之后一定会有返回值,韩绘制可以用return显式指定,也可以不指定返回值
函数返回值

一、普通函数的返回值用于函数执行完毕后,获取到我们要得到的结果。比如得到一个数学运算的结果。

  1. 所有函数都有返回值。
    没有return语句时,默认返回内容为undefined;
    有return语句,return后面的值,是函数的返回值;
    有return语句,return后面没有值,返回值是undefined。
  2. 函数使用return语句后,该函数会在执行完 return 语句之后停止并立即退出函数执行。
函数提升

还记得吗?在我们讲变量的时候说过因为JS预编译的原因,变量的声明会被提升到其所在的作用域的顶端(不提升变量值),对于函数声明这种方式定义的函数,js引擎会对函数的声明和定义整体提升。

另外:

  • 如果函数的声明与变量的声明使用的是一个变量名称,函数声明的优先级高于变量声明的优先级。
  • 如果声明了两个相同名称的函数,前面声明的会被后面的覆盖掉,所以JavaScript中函数没有重载
2、函数表达式:var 函数名 = function(){};
var func = function(parameter1, parameter2, parameter3){
	//执行的代码
}

创建一个函数并将它赋值给变量func 。注意:function关键字后面没有标识符,函数表达式创建的函数叫做匿名函数

  • 函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。
  • 函数表达式可以在任何地方声明。
  • -常规的调用方法是:变量(参数),这里的变量和函数名一样是指向了函数体,有小括号表示执行函数体。
匿名函数

匿名函数就是没有名字的函数,匿名函数的用途非常多,不过这里先只介绍匿名函数的定义和调用方法。

(function (){
    console.log("匿名函数被调用了");
})();

匿名自执行函数
给匿名函数外面加上一层()的时候,JavaScript编译会返回匿名函数的函数表达式,如果需要执行匿名函数,在匿名函数后面加上一个括号即可立即执行。

3、构造函数:var 函数名 = new Function(参数1,参数2,函数体);

构造函数后面还会讲到,这里也可以暂时略过。
JavaScript是一种面向对象的语言,如果你学习过其他面向对象的语言,可能会比较困惑,因为JavaScript中没有class,但并不意味着JavaScript中没有类,这只是说法的不同,在ES6之前class不是关键字,JavaScript通过构造函数来定义类,用new操作符调用函数就实现了实例化一个对象。这个对象具有构造函数定义的变量(属性)和函数(方法)。
Javascript构造函数

函数的参数

我们把定义函数时小括号内的参数叫形参,调用函数时小括号的参数叫实参。

形参(parameter):是在定义函数时使用的参数,用来接收调用该函数时传进来的实际参数。 函数调用时将实参内容复制一份,函数运行结束时,形参被释放。
实参(argument):是在调用时传递给函数的参数 。

函数参数传递是按值传递的。这句话的意思并不是说只能函数只能传递基本类型的参数,实际上基本类型和引用类型都可以作为形参传递给函数。

  1. 传递基本类型时,形参是实参值的一个副本,对形参的改变不会影响实参。
  2. 传递引用类型时,形参是实参对象引用地址的副本,此时形参和实参实际上指向了同一个对象,所以形参改变会同时改变实参的值。
JavaScript函数没有重载

函数重载指的是两个或两个以上的函数具有相同的函数名,但形参的个数或类型不同。程序通过判断传过来的参数的个数和类型,来决定选择调用哪个具体的函数。

JavaScript有个特殊之处,函数调用时不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数,也就是说形参和实参不相匹配也能成功运行、不会报错。
JavaScript中的同名函数,后面的函数会覆盖前面的函数 。JavaScript没有重载,不过可以根据arguments属性的长度判断来模拟重载.

内置对象arguments
函数作为对象,内部包含一个内置对象arguments,即可以表示函数本身,也可以表示函数的参数列表。
arguments对象只有函数开始时才可用。

  1. callee:该属性是一个指针,指向拥有这个arguments对象的函数(不建议使用)
  2. length:真正传递的参数的个数
  3. properties-indexes:函数的参数值(按参数列表从左到右排列)
function func(a,b,c)
{	
	console.log(arguments);  
}

func('abc','1');

访问(调用)函数的方法

1、函数调用模式: 函数名();

调用函数实际上就是调用某个对象的方法,如果函数名前没有对象,那么意味着调用的是window对象的方法,这时的this指向window。

2、方法调用模式: 对象.函数名();
s1.operation();

this:谁调用就指向谁

3、构造函数调用模式 :new 函数名();

this指向new出来的对象

4、上下文调用模式
语法:1 函数名.call(this指向,实参,实参)
  • 当传入的第一个参数为undefined或Null时,指向的是window
  • 当传入的第一个参数为简单数据类型时,this指向该数据的基本包装类型
语法:2 函数名.apply(this指向,数组或伪数组)

第一个参数与call语法相同,后面的数组参数中的元素拆解后传给函数。

你可能感兴趣的:(前端进阶之路,Javascript)