函数

2022/8/15 6:22:46

本文主要是介绍函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

函数

概述

函数就是多行代码的抽取(多行代码会构成特定的功能)也叫方法;

优点:

减少冗余代码(重复代码放在函数里面,需要时调用)

函数封装(特定的一些代码使用函数包起来)

提高代码的可维护性及阅读性

函数分类
  1. 系统函数 window里所有的函数都属于系统函数(alert()prompt() console.log())

  2. 内置函数 所有的内置对象里面的函数(Math.pow())

  3. 自定义函数 自己定义的函数

自定义函数的定义以及调用

1.使用function关键词定义匿名函数 (一般不传参)

function (形参  可省略){
    函数体(代码)
}
//直接调用(自动调用) 函数调用需要加上() 没有复用价值
(function (){
    console.log()
})()

2.使用function关键词定义具名函数

!!当定义了两个形参,但只写了一个实参时,不会报错,没有传进实参的形参会生成undefined

function  函数名 (形参,形参,...){
    函数体(代码)
}
function say(){
    console.log("hello")
}       //声明
say()  //调用
//变种声明
var sayhi = function(){
    console.log("hi")
}
sayhi()
//两种声明 调用速度 第一种更快
//function 和  var 在预编译阶段就会声明  所以可以在声明之前调用
//var 关键词修饰的变量在预编译是不会赋值的 所以在声明之前调用会输出undefined

3.使用new Function方式 (new 后面的内容首字母大写)

var 函数名 = new Function("形参1,形参2","函数体")//string类型
var sayBye = new Function('console.log("bye")')
sayBye()
//传参
var sayBye = new Function('username','console.log("bye bye!!"+username)')
//调用
sayBye('李四')

在程序执行之前有个预编译过程

预编译

1.会声明对应的function和 var关键词修饰的变量(开辟内存的操作)

2.对应的function的内存空间开辟以后会将对应的代码块放到其中等待调用

3.var关键词只会开辟一个空间 并不会进行赋值 (默认给一个undefined的值)

return关键词

return返回对应的数据 是在函数内容进行数据返回的 调用return后 后面的内容不会再执行

function sum(a,b){
    return a+b
    console.log("不会执行此代码")
}console.log(sum(1,2))//返回的对应的1+2的值

如果没有return关键词 返回的是undefined的值

function say(){
    console.log("hi")//hi
}
console.log(say())//undefined

函数标准定义

function 函数名(形参1,形参2,...){
    代码块;
    return
}
函数名 ()
函数执行过程

1.对应的开辟的function内存里面的代码块丢给方法栈去执行

2.执行栈就会自动执行对应的代码块,执行完返回对应的结果

3.当前结果返回完毕以后,对应的执行栈里面的结果的内存空间就会回收,将这个内存空间销毁

function sum(a){
    console.log(a)
    return a
}
sum()
sum()
//两个sum执行完输出的结果都是10,但是所占内存地址不一样
函数作用域
function a (n){
    var number = 1
    return number
}
console.log(number)  //会显示number is not  defined 
                    //因为作用域的原因,这里是一个局部变量
作用域

当前一个变量的作用范围 分为局部作用域(函数作用域)和全局作用域(在对应的全局变量)

局部作用域(在一个函数内声明的 或者是在一段代码块内声明的 他的作用范围就是当 前的代码块) if代码块里面没有局部作用域

全局作用域(在对应的全局声明 作用范围是全局的)

作用域链

当前作用域内没有找到对应的变量就会向上去找(不会向同级找),这种构成结构称为作用域链

当有var时打印内容写在赋值的上面,则会输出defined,而不会向上寻找,这是因为由于存在预编译,此时变量已经被定义,只是没有赋值,因此能找到这个定义了的变量,所以不会向上寻找

var a = 20
function fn(){
    console.log(a);//undefined   没有var关键词就输出20
    var a= 10
    if(10>9){
        console.log(a;)//undefined  没有var关键词就输出10
        var a =30
        if(5>4){
            console.log(a);//undefined   没有var关键词就输出30
            var a = 40
            if(a>10){
                console.log(a);//40   
            }
        }
    }
}
函数的arguments(参数数组 参数的集合)

arguments是一个伪数组 (有部分的数组特性)

所有的函数都具备arguments(对象)

1.可以通过length属性得到对应的长度

2.[ ]下标(从0开始)来访问里面的元素

function sum(){//不清楚参数个数(无参)
    //获取里面传递的所有的参数arguments length
    var result = 0
    //遍历对应的arguments里面的所有的参数
    for(var i= 0;i<arguments.length;i++){
        result +=arguments[i]//取出里面的参数进行求和
    }
    return result
}console.log(sum())
函数的嵌套

函数的嵌套: 函数内部可以再包含其他函数;

函数之间允许相互调用,也允许向外调用, 但是不可以调用同级函数的嵌套函数;

function fn1(){
    console.log('函数1');
    function fn2(){
        console.log('函数2');
        // fn1() 没有结束就是死循环
    }
    function fn3(){
        console.log('函数3');
        //调用函数2
        fn2()
        }
        fn2()
        fn3()
}
fn1() //函数1 函数2 函数3 函数2

 

DOM的简单操作

1.获取对应的标签(通过id获取)

document.getElementById("id的属性值")

2.input框的值获取value属性

document.getElementById("input框的id").value ---//得到的是string类型
//得到input框的值

3.点击事件onclick

element.onclick = function(){
//相关操作
}
事件驱动!!!
​
//通过输入框输入数值判断对应的奇偶并打印
<input id="number" type="text">
<button id="btn">判断奇偶</button>
<script>
function handlerClick(){
//拿到input框里面的内容 获取到input框
var inputValue = document.getElementById('number').value//得string类型
// console.log(typeof inputValue); 如果是+法操作必须要先转为number类型
//判断奇偶的操作
if(inputValue%2==0){   //取余操作会自动转换成string类型
    console.log('当前为偶数');
}else{
    console.log('当前为奇数');
    }
}
//首先需要点击按钮 获取按键 加点击事件
//事件触发  自动调用对应的函数 (事件驱动)
document.getElementById('btn').onclick = handlerClick //调用函数不用再加括号
</script>

所有的函数,没有调用不会执行,那么在我们浏览器中函数调用的源头在何处,就是事件, 只有使用事件去驱动, 函数才被调用; 如: onclick: 点击事件

递归

递归三要素

  • 找规律

  • 找临界值(没有规律的值)return

  • 自己调用自己(在函数内部调用自己的函数)

递归效率极低 (一般不使用 用作文件的遍历 菜单遍历)

2.4.6.8....第两百位
function fn(n){   //参数  n 表示位数
    if(n==1){  //没规律的
        return 2  //返回具体的值
    }else {  //有规律的  返回对应的规律公式
        return fn(n-1)+2  //fn(n-1)当做值来看
    }
}console.log(fn(200)) 

bfs 广度优先搜索

dfs 深度优先搜索



这篇关于函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程