函数
什么是函数
把特定代码片段,抽取成为独立运行的一个实体,就是函数
把函数理解为工具,日常的工具有哪些?
冰箱,洗衣机
工具有哪些特点
1.使用简单,无需原理
2.可以重复使用,不受限制
3.方便,效率高
函数有哪些好处
可以复用.
提高可读性
方便维护
函数的分类
系统函数 内置函数 自定义函数
系统函数,内置函数:
是官方提供的函数,可以直接使用
如:alert(),isNaN(),console.log(),
自定义函数:
是用户自己定义的函数,用户可以根据实际需求,对特定的功能使用函数来封装
v8引擎可以在node.js中跑起来
js (浏览器,nodejs服务器)
定义函数
function calc(n,m){
var res = n + m;
return res
}
1.定义函数,必须使用必须使用function关键字
2.函数的名称,遵循命名规则
1.只能是数字,字母,下划线,$;
2.不能以数字开头
3,不能是保留字或者关键字
4,严格区分大小写
5,遵循驼峰命名法
6,语义化
形参(形式上的参数)
形式参数的个数是可以随意定的,可以是0;
它的默认值是undefined,他是一个局部变量,只能在大括号里面使用
只有在调用的时候,才能确定类型和值
什么时候用形参
当有不确定的值就用形参
function中的大括号,作为一个保护作用,与外界变量不会相互影响
return终止函数,并返回结果,return关键字 后面一行代码,将不会被执行
如果函数没有return关键字.,该函数将默认返回undefined
函数的调用
var result=calc(10,20);
实参就是一个具体的值或者变量执行完函数的结果
遵循先定义.后使用
函数的调用方式: 函数名()
如:调用下面的函数:printOut();
function printOut{
document.write("Hello World!")
}
注意:
1,调用函数后会执行函数内部的代码块;
2,函数在不调用的情况下是不会执行的,只有调用后函数中的代码才会执行
大部分情况 有参数,有返回值 parseInt(),parseFloat();
有参数,无返回值
无参数,有返回值
无参数,无返回值
console.log();alert();document.write();parseInt()
prompt();
toFixed();
typeof();
isNaN();
confirm("你确定要删除吗");有返回值
Math.round()四舍五入;
定义一个没有返回值的函数
作用域:
就是起作用的范围.或者说有效范围
1. 啥时作用域
就是作用的范围
2.全局和局部
函数以外的变量,就是全局
函数内部的变量,就是局部
如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。
3.如果全局和局部同时存在?
如果全局变量和局部变量冲突重名,局部变量在作用域范围内会覆盖全局变量
4.JavaScript 变量生命周期
JavaScript 变量生命周期在它声明时初始化。
局部变量在函数执行完毕后销毁。
全局变量在页面关闭后销毁。
全局变量和局部变量案例
<script>
var n = 10
function fn(){
var n;
console.log(n);//udefined
n=200;
console.log(n);//200,局部变量优先
}
function fn1(){
var n=m=200;// var n=m; m=10;
console.log(m);//200
console.log(n);//200
}
fn1()
console.log(n);// undefined
console.log(m);//200 m没有被var定义到,是全局变量.
function fn1(m){// m被定义为局部变量,形参是局部变量
var n=m=200;// var n=m; m=10;
console.log(m);//200
console.log(n);//200
}
fn1()
console.log(n);//undefined
console.log(m);//undefined
</script>
函数的嵌套
内部函数不能被外部函数调用,可以调用外部函数
内部函数不能调用外部函数的内部函数,也不能被外部函数的内部函数调用
arguments
1.它只能在函数内部出现
2.他是伪数组
3.用于接受实参
function fn(){
var arr=[];//真数组
console.log(arr);
console.log(arguments);
}
fn(100);//arguments 接受实参
function fn1(){
var sum=0;
for(i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
console.log(fn1(20,20,30,100));
其中(20,(arguments[0]) 20,(arguments[1]) 30, 100)
arguments.length表示伪数组arguments的长度
arguments[0];表示伪数组的第一个数,arguments用来接受实参
DOM的操作:
1.获取元素节点对象:document.getElementById('id');
2,获取输入框的内容:value属性
3,点击事件:onclick
示例:
在输入框中输入数字,点击按钮调用函数来判断奇偶性?
注意:document.write()在文档页面加载完后使用会覆盖页面内容,尽量少用
事件驱动:
因为函数不会主动执行,只有当调用的时候才会执行函数中的代码,在前面的DOM操作中,我们点击了按钮才触发函数调用
所有的函数,没有调用不会执行,那么在我们浏览器中函数用的源头在何处,就是事件,只有使用事件去驱动,函数才被调用;如:onclick:点击事件
//1.获取指定按钮
var oBtn = document.getElementById("btn") //通过id获取文档里的元素
//2.给按钮绑定点击事件 (绑定,不代码执行)
// onclick 点击
//事件也可以帮忙执行函数
oBtn.onclick = function () {
//3.执行事件,逻辑代码
console.log("台上的男人真帅!");
}
//1.鼠标点击页面的按钮,也执行函数
//2.还可以直接执行函数,把 onclick当做函数名对待
oBtn.onclick();
//一口气拿到 页面上所有的按钮
var oBtns = document.querySelectorAll("button");
//遍历5个按钮
for (var i = 0; i < oBtns.length; i++) {
// console.log(i);
//给每一个按钮绑定点击事件
oBtns[i].onclick = function () {
//获取下标
console.log(i);
}
}
console.log(i);
//点击按钮3,i打印了谁? 2 ,0 , 0 ,1,2
函数的递归调用:
函数可以自己调用自己,必须有结束条件,成为函数的递归调用
重要性:
递归的分量,递归属于函数中比较难理解的知识,在应用开发中,虽然使用不是很频繁,但是很体现你的功底,而且,从事IT行业,最好要会递归,如果说现在可以不要求里;灵活运用的话,以后到公司中一定要会,如果面试中有人问你递归,说明,他对你要求挺高
递归调用的方式:
1,首先去找临界值,及无需计算,获得的值(一般该值是返回值).
2.找这一次和上一次的关系(一般从后往前找)
3,假设当前函数已经可以使用,调用自身计算上一次的运行结果,再写出这次的运行结果。
1.什么是递归?
// 函数自己调用自己,必须有零界点(结束条件)
//2.递归能做什么?
// 循环能做的事,递归都能实现
// 递和归 都做了什么事?
1. 到100的和使用递归实现?
function fn(n) {
if (n == 1) {
return 1;//终止函数,并返回结果
}
return n + fn(n - 1);
}
console.log(fn(100));
2.实现 1到100的乘积
function fn1(n) {
if (n == 1) {
return 1;
}
return n * fn1(--n)
}
console.log(fn1(5));
3. 输入一个n,打印n个hello world
function fn3(n) {
console.log("hello world");
if (n == 1) {
return
}
fn3(n - 1);
}
fn3(5)