函数
概述
函数就是多行代码的抽取(多行代码会构成特定的功能)也叫方法;
优点:
减少冗余代码(重复代码放在函数里面,需要时调用)
函数封装(特定的一些代码使用函数包起来)
提高代码的可维护性及阅读性
函数分类
-
系统函数 window里所有的函数都属于系统函数(alert()prompt() console.log())
-
内置函数 所有的内置对象里面的函数(Math.pow())
-
自定义函数 自己定义的函数
自定义函数的定义以及调用
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 深度优先搜索
标签:function,调用,console,函数,var,log From: https://www.cnblogs.com/sdcffsdc233/p/16586446.html