学习函数最大的目的就是给我们省劲儿,它可以对代码复用。
函数定义一次,可以无限制的调用。
逻辑修改的时候,只要改函数定义里就可以了。
通过参数,我们可以得出不同的结果。
- JavaScript函数是什么?
JavaScript 函数是被设计为执行特定任务的代码块,它里面是一系列的逻辑运算。
JavaScript 函数会在某代码调用它时被执行。
JavaScript函数使用的流程大概是以下几步:
定义、调用、返回。
这个很像我们平时炒菜。
函数定义类似我们的菜谱;
函数调用类似炒菜过程;
函数返回类似菜炒好以后,盛盘上桌。
这里面还会有一个知识点:函数参数。
函数参数类似厨房里的各种调料。
下面,我就来具体讲解一下。
- JavaScript函数定义
JavaScript函数的定义,常见的有两种:函数声明和函数表达式
函数声明通过 function 关键词定义函数,其后是函数名、括号 ()、代码块{}。
函数名可包含字母、数字、下划线和美元符号(规则与变量名相同)。
括号里可包括零个或多个参数,多个参数由逗号分隔,参数可以是任意的数据类型。
格式如下:
function 函数名(参数1,参数2,参数3,……){ 要执行的代码 }
表达式也可以定义函数,函数表达式可以在变量中存储。比如:
var a = function(x,y){return x * y};
大家注意一下,函数声明的时候,大括号结束之后不用写分号,但是,通过表达式定义的函数,一般会在最后加一个分号,它算是一个完整的句子。
细心的同学可能会发现,上面的函数没有名称。没有名称的函数叫做匿名函数。通过表达式定义的函数,通常使用匿名函数,把函数表达式赋值给一个变量。变量的值就是一个函数了。调用的时候,通过变量名调用。
函数如果挂载到一个对象上,作为对象的一个属性,就称它为对象的方法。对象是有属性和方法的。属性一般是静态的,方法其实就是函数。
函数在代码里只用定义一次,但是,可以被调用无数次。定义一个函数,该函数并不会被执行,只有调用的它的时候,它才会执行。
就像我们写了一个菜谱,菜谱并不会炒出菜来,只有我们真正炒菜的时候,菜谱的每一步才会被我们真正的执行起来。
- JavaScript函数参数
参数分为形参和实参。
形参(形式参数)是在函数定义中所列的名称。
实参(实际参数)是当调用函数时由函数接收的真实的值。
形参是变量名,实参是变量值。
参数就类似菜谱里的调料,菜谱上写的酱油、醋、盐、油等等就是形参,我们炒菜的时候,各个调料实际放的量,就是实参。
JS函数也可以看成是对象,因为JS函数也有属性和方法。
介绍一个和参数有关的函数内置对象:arguments
。它是一个数组,里面是所有的实参,和所有普通的数组一样,它有一个非常常用的属性:length(arguments
的长度,也就是实参的个数)。
比如,我们定义了一个test函数,里面返回了实参个数,就可以这样写:
function test(a,b){
return arguments.length; //函数返回值
}
实参和形参的个数可以不相等。
当实参的个数小于形参的个数,函数里接收到的是undefined。
当实参的个数大于形参的个数,可以通过arguments接收。这种情况一般不会出现。
参数通过值传递和通过对象传递,对于原始值的影响是不一样的。
这里说的对象也包括数组,数组是一种特殊的对象。
通过值传递,函数改变了参数的值,它不会改变参数的原始值。
参数的改变在函数之外是不可见的。
通过对象传递,函数改变了对象的属性值,它会改变参数的原始值。
参数的改变在函数之外是可见的。
为什么它俩会不同呢?
值传递有点类似复制粘贴,我们复制了一个文件,修改复制的文件并不会影响原文件。
对象传递传的是一个地址,是把地址传过来,你修改了地址里的值,原始值也是用的同样的地址,所以,原始值也会跟着改变。
如果学过C语言的指针,会很好理解这个地方。
写个例子:
<!DOCTYPE html>
<html>
<head>
<title>刘小妞的栖息地</title>
</head>
<body>
<p id="demo1"></p>
<p id="demo2"></p>
<script>
var a = {'test':123}
var b = 99;
function test1(x) {
x.test = 111;
}
function test2(x) {
x = 100;
}
test1(a); //函数调用
test2(b); //函数调用
document.getElementById("demo1").innerHTML = "原始值改变:" + a.test;
document.getElementById("demo2").innerHTML = "原始值不变:" + b;
</script>
</body>
</html>
- JavaScript函数调用
JS中调用函数一般发生在以下几种情况:
1、当事件发生时(当用户点击按钮时)
2、当 JavaScript 代码调用时
3、自动的(自调用)
今天主要介绍JS代码调用函数常用的两种方法。
以函数形式调用,方法如下:
函数名(实参1,实参2,……);
写个例子:
//函数定义
function test(){
alert("我是刘小妞");
}
//函数调用
test();
这是调用函数的常见方法,但并不是一个好习惯。
全局变量、方法或函数很容易在全局对象中产生命名冲突和漏洞。
作为方法来调用函数
在JavaScript 中,可以把函数定义为对象方法。
写个例子:
//定义一个对象
var girl = {
firstName:"Liu",
lastName: "XiaoNiu",
fullName: function () {
return this.firstName + " " + this.lastName;
}
}
//函数作为方法调用
girl.fullName();
一般对象里的方法是匿名函数,调用的时候,格式如下:
对象名.属性名(参数1,参数2,……);
说一下this。
在 JavaScript 中,被称为 this 的事物,指的是“拥有”当前代码的对象。
this 的值,在函数中使用时,是“拥有”该函数的对象。
请注意 this 并不是变量。它属于关键词。无法改变 this 的值。
其实,说白了,this就是一个代词。
我们平时说话的时候,经常用你、我、他。this的作用和他们一样。
上面这个例子中的this指代的是girl这个对象。
this.firstName
和girl.firstName
是等价的。
在对象里,经常用this关键词。这样,我们就不用考虑对象名的问题了。
自调用函数是自动被调用,不经常用。
写个例子:
<script>
(function () {
alert("sdfsf");
})();
</script>
上面的匿名函数会自动执行。自调用函数的写法一般是把函数定义放在一个括号里,括号外面跟着一个括号。
- JavaScript函数返回
函数返回是用return关键词,上面写的例子也都看到了。
当函数执行遇到return关键词的时候,程序会停止,并返回return后面的值。
函数也可以没有返回值,是否需要返回值,是根据函数的功能决定的。
局部变量
在 JavaScript 函数中声明的变量,会成为函数的局部变量。
局部变量只能在函数内访问。
看一个例子:
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<p id="demo1"></p>
<script>
var a = 1; //全局变量
function test(){
var b = 2; //局部变量
document.getElementById("demo").innerHTML = a * b;
}
test();
document.getElementById("demo1").innerHTML = typeof b;
</script>
</body>
</html>
demo里显示2,
demo1里显示undefined
由于局部变量只能被其函数识别,因此可以在不同函数中使用相同名称的变量。
局部变量在函数开始时创建,在函数完成时被删除。
JS函数是前端中很重要的一部分,一定要掌握好,还有其他关于js函数的知识,大家可以搜微信公众号"刘小妞的栖息地"或者识别下面的图片查看。有的文章不能及时更新到这里,也感谢大家的支持,有写的不好的地方,请大家多多指教。