立即执行,不需要再调用一次
当你定义好一个函数以后,如果你想让这个函数内部的代码执行一下
需要给一个元素绑定一个行为
在js里面获取一个页面元素有一个简单的办法,就是直接使用id名称
在一个页面里面,一个元素的id名称可以直接被当做一个js的变量来使用这个id名表示的就是这个元素暂时添加一个点击行为,就是 onclick
给他赋值为一个函数名称就可以了
不需要写小括号,因为我不是让你直接执行,而是当你点击的时候执行 <body> <div id="box"></div> <script> // 准备一个函数 function weibolu() { console.log('呜呜呜') console.log('叮~') } // 依赖行为调用 // box 是页面中一个 div 的 id 名称, 在 js 里面可以直接使用 // onclick 当点击在某一个元素身上的时候 // 等于号后面是一个函数名称, 不需要小括号 // 当你点击这个 box 元素的时候, 会调用后面的这一个函数 // 点击多少次调用多少次 box.onclick = weibolu </script> </body>当你调用一个函数的时候,方式都是一样的
但是调用的时机取决于你使用哪一种方式定义函数
就是写在函数定义的时候的 () 里面的
可以写多个,多个的时候中间用逗号(,)分隔
形参:就是一个只能在函数内部使用的变量
至于这个变量(形参)的值是什么,由函数的实参决定
就是写在函数调用的时候的 () 里面的
可以写多个,多个之间使用逗号(,)分隔
实参:是一个准确的数值,用来给对用的形参赋值的
// 形参和实参 function bingxiang(a) { // a 就是一个只能在函数内部使用的变量名 console.log('嗡嗡嗡') console.log('冰冰冰 ' + a + ' 冰冰冰') } // 这个位置的小括号里面的内容叫做实参, 式用来给形参赋值的 bingxiang('大熊猫') bingxiang('大象') // 多个参数 function bingxiang(a, b, c) { // a b c就是一个只能在函数内部使用的变量名 console.log(a) console.log(b) console.log(c) } // 这个位置的小括号里面的内容叫做实参, 式用来给形参赋值的 bingxiang('大象', 100, true)前面的一一对用,多出来的形参,没有实参进行赋值
在函数内部使用的时候,就是没有赋值的变量,就是undefined
// 形参多 function fn(a, b, c) { // 在这个函数里面, c 就相当于定义了一个变量, 但是没有被赋值 // c 在使用的时候就是 undefined console.log(a) console.log(b) console.log(c) } fn('hello world', 100)前面的一 一对用,多出来的实参,在函数内部没有形参接收
相当于你白写了多出来的实参,在函数内部不能直接使用
// 实参多 function fn(a, b, c) { // 我在这里不能直接使用传递进来的 200 300 400 500 // 但是不会报错 console.log(a) console.log(b) console.log(c) } fn('hello world', true, 100, 200, 300, 400, 500)是函数内部的一个特殊的变量
在每一个函数内部,都有一个天生的变量,不需要我们定义,直接就能拿来使用,这个变量叫做 arguments,表示:所有实参的集合(实参的数组)
会把所有的实参按照从左到右的顺序依次拍好
给每一个实参一个编号(索引 / 下标)
这个编号(索引 / 下标)是从 0 开始的,依次递增
当你需要获取到这里面的某一个实参值的时候
你只需要写 arguments[编号] 就能得到某一个准确的实参值
// 简单演示 arguments function fn() { // arguments 不需要定义, 直接使用就行 console.log(arguments) console.log(arguments[0]) // 我要获取 arguments 里面索引为 0 的那一项 hello console.log(arguments[1]) // 我要获取 arguments 里面索引为 1 的那一项 world console.log(arguments[2]) // 我要获取 arguments 里面索引为 2 的那一项 100 console.log(arguments[3]) // 我要获取 arguments 里面索引为 3 的那一项 200 // 我要获取 arguments 这个集合的长度 console.log(arguments.length) // 4 } fn('hello', 'world', 100, 200)length 表示arguments 这个集合的长度,也就是里面有多少个数据
值是一个 number 数据类型的数字
如果你想得到这个属性就写 arguments.length
因为 arguments 的索引(下标)是按照从 0 开始一次叠加的顺序
我们的循环刚好也可以给我提供一组有规律的数字
所以我们可以使用循环的方式来遍历 arguments
// 循环遍历 arguments function fn() { // 五个数据的索引分别是 0 1 2 3 4 console.log(arguments) // 使用循环提供一个从 0 ~ 4 的数字 // 循环的结束位我们应该根据 arguments 的 length 来决定 for (var i = 0; i < arguments.length; i++) { // console.log(i) // i 得到的就分别时 0 1 2 3 4 // 当 i === 0 的时候, 使用 arguments[0] // 当 i === 1 的时候, 使用 arguments[1] // 当 i === 2 的时候, 使用 arguments[2] // ...... console.log(arguments[i]) } } fn('hello', 'world', true, 100, 500, false, '你好')当 length === 5 的时候,我们要的索引数字是 0 1 2 3 4
for (var i = 0; i < 5; i++) { } 得到的 i 分别是 0 1 2 3 4当 length === 7 的时候,我们要的索引数字是 0 1 2 3 4 5 6
for (var i = 0; i < 5; i++) { } 得到的 i 分别是 0 1 2 3 4 5 6当我们定义函数的时候,如果能确定以后使用的实参的个数
我们推荐使用形参的方式来获取实参的每一个数据,因为方便
当我们定义函数的时候,如果不能确定以后使用的实参的个数
我们推荐使用 arguments 的形式来获取实参的每一个数据,因为灵活
函数:封装一个功能,即:冰箱就是封装了一个制冷功能
参数:在调用的时候传递,即:你向冰箱里面放了什么东西
返回值:调用完函数得到的结果,即:冰箱能给你的是一个什么
parseInt 是一个 js 内置(自带)的函数
parseInt( ) 就是在调用这个函数
parseInt( 10.234 ) 就是传递一个参数
var result = parseInt( 10.234 )
result 接收的就是 parseInt( ) 这个函数的返回值这个函数里面做的就是 把你传递进来的数据转换成数值类型
然后再返回给你作为函数的返回值使用
让外部程序可以调用函数内部的值即:让全局变量可以访问局部变量打断函数不在继续执行 - 类似于 break
当你在函数内部的代码执行到 return 关键字以后return 后面的代码就不带执行了,直接结束函数和 break 的功能比较相似 break 是结束循环的关键字return 是结束函数的关键字 function fn() { console.log('第一行代码执行') console.log('第二行代码执行') return // 这里开始向后的代码就不在执行了 console.log('第三行代码执行') } fn()点击确认返回**true **
点击取消就返回false
var a = confirm('确定删除吗?') console.log(a)点击确认返回**输入框的值 **
点击取消就返回 null
var res = prompt('请输入姓名'); console.log(res)递归:就是一个函数的高级使用方法 — 自己调用自己
本质:
自己调用自己递进去,归回来就是一个函数自己调用自己,把一个有规律的问题,转换成自己和自己的前一步
注意:一定要设置一个尽头,不能一直递进去(死递归)
写递归函数:先写停的条件
// 死递归!!!死递归!!!死递归!!! function fn() { console.log('fn 函数执行了一下') // 自己调用自己 fn() // 打开变成死递归了 } fn()90%~95% 递归函数能做的事情,循环也能做,因此推荐使用循环,不推荐使用递归
慎用!!!慎用!!!慎用!!!
/* 递归求阶乘 */ function fn(n) { // 当 数字 === 1 的时候, 结束我们递进来的过程 // 开始准备归回去 if (n === 1) { return 1 } // 把每一个数字的阶乘转换为求 数字 * 数字-1 的阶乘 return n * fn(n - 1) } var res = fn(4) console.log(res) // 24 /* 斐波那契 数列 数列: 1 1 2 3 5 8 13 21 34 55 ... 第一个和第二个永远是 1 第三个数字开始, 是前两个数字的和 使用递归来计算 比如: 我要求 数列的 第 6 位是什么 ? 8 求 fn(6) -> 求 fn(5) + fn(4) 停的条件: 当 n === 1 或者 n === 2 的时候 当你要求 第一位 或者 第二位 的时候 停掉开始归回去, 直接返回 1 */ function fn(n) { // n 表示我要求的是这个数列的 第几位 数字 // 1. 先写停的条件 if (n === 1 || n === 2) { // 表示要得到前两位, 一定是 1 return 1 } // 2. 写一个递归进去的条件 return fn(n - 1) + fn(n - 2) } var res = fn(6) console.log(res) // 8 var res2 = fn(10) console.log(res2) // 55 /* 用递归函数求和 */ function fn(n) { // 当 数字 === 1 的时候, 结束我们递进来的过程 // 开始准备归回去 if (n == 1) { return 1 } return fn(n-1) + n } var res = fn(100) console.log(res) // 5050 var res2 = fn(50) console.log(res2) // 1275 var res3 = fn(10) console.log(res3) // 55