1.1初识函数
1.1.1函数的定义
1.函数用于封装一段特定功能的代码
作用:提高代码的复用性,降低维护的难度(你将实现一个功能多段重复的代码变为一段代码,降低了维护的难度,你将这段代码用一个函数封装,要使用这个功能的时候就调用函数,即可提高代码的复用性)
1.1.2函数的定义与使用
1.函数的定义(定义为动词)四部分组成:1.function关键字 2.函数名 3.参数 4.函数体
function 函数名 ([参数1,参数2,...]){
函数体
}
补充:
1.function是定义函数的关键字
2.函数名可由字母,数字,下划线,和$符号组成,函数名不能以数字开头,且不能是javascript中的关键字
3.参数是外界传递给函数的值,此时的参数成为形参,它是可选的,多个参数之间用“,”分隔
4.“[]”用于在语法中标识可选参数,实际代码不用写“[]”
5.函数体是由函数内所有代码组成的整体,专门用于实现特定的功能
2. 函数的调用“函数名()”
函数名称([参数1,参数2,...])
补充:
1.这里的参数称为实参
2.实参的个数可以使零个,一个或多个。通常情况下,函数的实参列表与形参列表顺序对应。当函数体内不需要参数,调用时可以不传参。
3.若在调用函数需要返回函数的结果,在函数体中可以使用return关键字返回,这个结果称为返回值。
4.函数的定义调用顺序不分前后(这个就和函数表达式不同)
1.1.3函数参数的设置
函数在定义时根据参数的不同,可分两种类型,一种是无参函数,指的是在定义函数时不设置参数的函数。另一种是有参函数,指的是在定义函数时设置了参数的函数。
1.无参函数
<script>
function greet() {
console.log("Hello my name is 木木艾薇")
}
greet()
补充:
即使函数的功能不需要设置参数,小括号“()”也不能省略
2.有参函数
<script>
function bigNum(a, b) {
a = parseFloat(a)
b = parseFloat(b)
return a > b ? a : b
}
console.log(bigNum(1, 3))
知识加油站:
1.含有默认值的函数
在设置函数的形参时,还可以为其指定默认的值。当调用者未传递函数参数时,函数将使用默认值进行操作。
<script>
function greet(name, say = 'my name is') {
console.log(say + name)
}
greet("木木艾薇")
</script>
2.剩余参数
在定义函数时,除了可以指定具体数量的形参,还可以利用“...变量名”的方式动态接收用户传递不确定数量的实参
<script>
function transferparm(num1, ...theNums) {
console.log(theNums)
}
transferparm(0, 1, 2, 3, 4)
</script>
补充:
实参中的0传到了形参num1里
如果定义transferParam()函数时,所有的参数都不确定,则可以将上述代码修改成以下形式
<script>
function transferparam(...theNums) {
console.log(theNums)
}
transferparam(1, 2, 3, 4)
</script>
1.14获取函数调用时所传递的所有实参
(小补充:javascript语法 ——对象.属性,对象.语法,对象.事件 )
若不能确定函数的形参个数,定义函数时可以不设置形参,在函数体中直接通过arguments对象获取函数时所调用的实参,arguments是当前函数的一个内置对象,所有函数都内置了一个arguments对象,该对象保存了函数调用时所传递的所有实参。实参的个数可通arguments.length获取,具体的实参可以通过数组遍历方式获取。
<script>
function number() {
console.log(arguments.length)
console.log(arguments)
}
number(1, 2, 3, 4, 6)
</script>
1.2函数内外变量的作用域
我们知道变量要先定以后使用,但是并不意味着,定义后的变量就可以在任意位置使用该变量。
<script>
function judge() {
var age = 18
}
judge()
console.log(age)
它的结果是什么呢?18吗?
上述代码执行后,控制台出现age is not defined 错误信息,表示age变量没有定义。之所以出错是因为age变量只能在judge()函数体内使用。由上述示例可知,变量需要在被定义的的区域才能被使用,这个区域是变量的作用范围。
1.全局变量
定义:不在任何函数内定义(显式定义)的变量或在函数内省略let定义(隐式定义)的变量被称为全局变量,它的作用域是全局作用域,在同一个页面文件中的所有脚本都可以使用。
2.局部变量
定义:在函数体内利用let关键词声明的变量称为局部变量,它的作用域被称为函数作用域,仅在函数体内有效。
<script>
let a = "one"
function test() {
var a = "two"
console.log(a)
}
test()
console.log(a)
有结果可知第一个a是全局变量,第二个a是局部变量
总结:那我们该如何辨别全局变量和局部变量呢?
我们应该明白局部变量要满足两个条件,在函数体内+用let关键词声明,也就是说在函数体外,或者没有在函数体内用let关键字声明都是全局变量。
1.3函数进阶
1.3.1函数表达式
函数表达式是指将函数值赋值给变量的表达式的,通过“变量名()”的方式即可完成函数的调用,小括号“()”可传入参数。函数的表达式也是javascrpt中另一种实现自定义函数的方式。
<script>
let name = function name1(num1, num2) {
return num1 + num2
}
document.write(name("我是", "木木艾薇"))
</script>
用document.write的作用是让它显示在页面上。
补充:
函数表达式与函数的的定义方式几乎相同,那他们有什么不同吗?
1.函数表达式的定义必须在调用前,函数定义的方式不限制定义与调用的的顺序
<script>
document.write(name("我是", "木木艾薇"))
let name = function name1(num1, num2) {
return num1 + num2
}
</script>
解释:报错了,报错的原因就是调用在定义的前面。
函数定义的方式:
<script>
document.write(sum(1, 3))
function sum(num1, num2) {
return num1 + num2
}
</script>
函数定义的方式没有报错
2.函数表达式调用的方法通过“变量名()”不能通过“函数名()”的方式调用
1.3.2匿名函数
为什么需要匿名函数呢?在项目开发中,通常需要团队合作来完成一个完整的项目,每个程序员编写代码实现功能时,经常会定义一些函数,再给这些函数命名时经常会遇到与其他人取相同名字的情况,就会出现命名冲突的情况,那如何解决这个问题?,使用javascript中的匿名函数可以有效避免函数命名冲突问题。
定义:所谓匿名函数,指的时没有名字的函数,也就是在定义函数时省略函数名。
1.函数表达式中省略函数名
利用函数表达式实现匿名函数,调用时使用“变量名”,示例代码如下
<script>
let fn = function (num1, num2) {
return num1 + num2
}
console.log(fn(1, 3))
</script>
在上述示例中,访问匿名函数需要使用fn()来调用
补充:
通常情况下,如果函数的返回值需要使用变量来接收时,可以使用函数表达式来实匿名函数的调用,并且可以通过“变量名()”的方式调用多次。
2.匿名函数的自调用
匿名函数的自调用就是将匿名函数写在小括号内,然后进行调用。示例代码如下
<script>
(function (num1, num2) {
console.log(num1 + num2)
})(2, 3)
</script>
在上述示例中,使用小括号“()”标注匿名函数,匿名函数的小括号“()”表示给匿名函数传递参数并立即执行,完成函数的自调用
补充:
自调用只能调用一次。在开发中,如果希望某个功能实现一次,可以使用匿名函数的自调用方式来完成。
3.处理事件
使用匿名函数处理事件中在开发项目中经常使用,例如使用匿名函数处理单击事件,示例代码如下
<body>
<button id="bt1">你好</button>
<script>
//用document.getElementById方法获取了页面上ID为bt1的元素(即上面提到的按钮),然后将这个元素赋值给bt1变量。这样,bt1变量就引用了那个按钮,之后我们就可以通过这个变量来操作按钮了。
let bt1 = document.getElementById("bt1")
bt1.onclick = function () {
alert("hi,every body")
}
</script>
</body>
知识加油站:
箭头函数是ES6新增函数,它用于简化函数定义语法。小括号可以放置参数,箭头函数的语法格式如下
()=>{}
从上述语法中可以看出箭头函数是匿名函数。将箭头函数赋值给一个变量,然后可以通过变量名实现箭头函数的调用。
<script>
let fun = (num1, num2) => {
return num1 + num2
}
console.log(fun(1, 2))
箭头函数存在两种特殊情况
(1)省略大括号和return关键词
在箭头函数中,当函数体只有一段代码,且代码的执行结果就是函数的返回值,可以省略函数体的大括号以及return关键词。
<script> let fn=(num1,num2)=>num1+num2 </script>
上述代码示例中,函数体内只有一句代码“num1+num2”且函数的返回值是“num1+num2”的结果因此可以省略大括号“{}”和return关键词
(2)省略参数外面的小括号
在箭头函数中,当参数只有一个时,可以省略外面的小括号。
<script> let fn=name=>{ console.log(name) } </script>
1.3.3回调函数
什么是回调函数?回调函数就是在函数里调用别的函数。
<script>
function cooking(food) {
//厨师做菜
return food = flavour(food)
}
function flavour(food) {
let food1 = food + "特辣"
return food1
}
console.log(cooking("鱼香肉丝"))
</script>
嘿嘿 。
1.4嵌套与递归
1.4.1函数的嵌套与作用域
在开发项目中,一个复杂的功能往往需要定义多个函数来完成,对于其中一个函数而言。它可能依赖另一些函数才能运行。但是,如果我们希望这些依赖的函数只能在函数的内部访问,其他函数不能访问,这时候可以把这些依赖函数定义在本函数内部,这样在一个函数内部定义其他函数就形成嵌套函数。对于嵌套函数而言,内层函数只能在外层函数作用域执行,在内层函数的执行过程中,若需要引入某个变量,首先会在当前作用域中寻找,若未找到,则继续向上一层作用域寻找,直到全局作用域,我们将这种链式的的查询关系称为作用域链。代码示例如下
<script>
let i = 26
function fn1() { //定义第一个函数
let i = 20
function fn2() { //定义第二函数
function fn3() { //定义第三个函数
console.log(i)
}
fn3()
}
fn2()
}
fn1()
</script>
控制台输出的结果为20,说明i的值为fn1()函数内定义i的值。对于嵌套函数fn3()来说,输出变量i的过程是先从本函数内部去寻找变量i是否存在,很明显fn3()函数内部没有定义变量i。接着向上层fn2()寻找,fn2()中也不存在变量i的定义。继续向上层fn1()寻找fn1()中存在变量i的定义,因此控制台输出的i值为20.
1.4.2递归调用
定义:递归调用是一种函数嵌套调用中的一种特殊调用,它指的是是一个函数在其函数体内调用自身的过程,这种函数称为递归函数,递归可以利用简单的代码实现复杂的计算,需要注意的是递归调用必须要加退出条件。
为了让大家更好的理解递归调用,下面通过根据用户输入的计算指定数据的阶乘案例进行演示。定义factorial()函数。利用递归函数调用实现阶乘计算。
<script>
function factorial(n) {
if (n == 1) {
return 1
}
return n * factorial(n - 1)//自己调用自己
}
let n = prompt("求n的阶乘 \n n是大于等于1的正整数,如2的表示2!。")
n = parseInt(n)
if (isNaN(n)) {
console.log("输入的n值不合法")
} else {
console.log(n + "的阶乘为:" + factorial(n))
}
1.5闭包函数
1.5.1什么是闭包函数
所谓闭包函数,指的是有权访问另一函数作用域内变量(局部变量)的函数。
作用:
1.在函数外部读取函数的内部变量
2.让变量始终保持在内存中,直到页面关闭
闭包函数常见的实现方式在一个函数A内部创建另一个函数B,然后将函数B作为函数A的返回值。当调用函数A后,调用者就会得到函数B,通过函数B来访问A中的局部变量。
1.5.2闭包函数的实现
<script>
function hs1() {
let number = 0
function hs2() {
++number
console.log("我被调用第" + number + "次")
}
return hs2
}
let hs = hs1()
hs()
hs()
hs()
</script>
这段代码实现了hs1()的局部变量number的访问。使用闭包函数实现在hs2()函数中访问hs1()函数内部的局部变量并输出了hs2()函数被调用的次数。
标签:function,调用,console,log,javascript,定义,函数 From: https://blog.csdn.net/2301_81827214/article/details/143446552