目录
一、二维数组
1.创建方式
2.访问二维数组元素
3.练习
(1)求3*4的二维数组的每行元素之和
(2)求3*4的二维数组的每列元素之和
(3)求3*3的二维数组的对角线元素之和
4.二维数组的转置
二、函数
1.函数
2.定义
3.调用
4.函数分类
(1)根据有无返回值分
(2)根据函数有无参数分
练习:
(1)定义函数计算m~n的数据之和
(2)定义一个函数判断一个数是否是素数。输出100以内的所有素数
(3)定义一个函数判断其是否是'水仙花'数.输出1000以内的所有'水仙花'数
5.函数表达式
6.回调函数
7.函数的递归调用
(1)用递归解决问题的前提条件
(2)递归的过程
8、递归调用示例
(1)定义递归函数:输出斐波拉契数列的前20项
(2)用递归函数计算1+2+3+...+100的值
(3)定义递归函数打印一个整数的每一位数字
三、作用域的分类
1.作用域:作用范围
2.全局变量
3.局部变量
4.块级变量
5.作用域链
六、闭包函数
1.作用
七、立即调用的函数表达式
1.格式
2.练习题
定义函数,计算如下数列的前20项之和:2/1、3/2、5/3、8/5...
一、二维数组
通过两个下标(索引)来确定一个元素
1.创建方式
(1)使用new Array()创建
(2)通过'[]'创建
2.访问二维数组元素
数组名[下标1][下标2]
默认:按行优先,'下标1'是行下标,'下标2'是列下标
3.练习
(1)求3*4的二维数组的每行元素之和
var arr=[
[12,25,4,59],
[11,33,41,26],
[22,87,5,17]
]
(arr)
for(var i=0;i<;i++){
var sum = 0
for(var j=0;j<arr[i].length;j++){
sum += arr[i][j]
}
('第'+(i+1)+'行元素之和='+sum)
}
(2)求3*4的二维数组的每列元素之和
var arr=[
[12,25,4,59],
[11,33,41,26],
[22,87,5,17]
]
(arr)
for(var i=0;i<arr[0].length;i++){//外循环:表示列下标
var sum = 0
for(var j=0;j<;j++){//内循环:表示行下标
sum += arr[j][i]
}
('第'+(i+1)+'列元素之和='+sum)
}
(3)求3*3的二维数组的对角线元素之和
var arr=[
[1,2,3],
[4,5,6],
[7,8,9]
]
var s1=0,s2=0
for(var i=0;i<;i++){
s1 += arr[i][i];
s2 += arr[i][-i-1]
}
('左上-右下对角线元素和=',s1)
('左下-右上对角线元素和=',s2)
4.二维数组的转置
var arr = [
['a','b','c',1],
['d','e','f',2],
['g','h','i',3],
['j','k','l',4]
]
var res = []
for(var i=0;i<;i++){//外循环:i是arr的列下标,也是res的行下标
res[i] = []
for(var j=0;j<;j++){//内循环:j是arr的行下标,也是res的列下标
res[i][j] = arr[j][i]
}
}
(res)
二、函数
1.函数
可以实现某种功能的程序代码块(重复使用)
2.定义
function 函数名([参数])
{
函数体语句
}
(1)function是关键字
(2)'函数名'是标识符,要符合JavaScript的标识符的定义规则
(3)'参数':函数可以有参数也可以没有参数。无论函数是否有参数,函数名后的圆括号不能省略
(4)'{}':表示函数的作用范围,不能省略
function getSum(){
var sum = 0
for(var i=1;i<=100;i++){
sum +=i
}
return sum
}
3.调用
函数名([参数])
4.函数分类
(1)根据有无返回值分
A、有返回值函数
在函数中含有 return 语句。通常使用完成某种运算,并将运算结果返回
强调:return作用
a:返回值一个值
b:从当前函数中退出
B、无返回值函数
在函数中没有return语句。通常函数只是实现某种功能,无需返回任何值
(2)根据函数有无参数分
A、有参函数
表示函数在实现某种运算或实现某种功能时,需要外部参数的参入
function showArray(arr){ //arr是形参,没有实际值,只是占位符
var str = ''
for(var i=0;i<;i++){
for(var j=0;j<arr[i].length;j++){
str += arr[i][j] + '\t'
}
str += "\n"
}
(str)
}
showArray(info) //函数的调用:info是实参,有实际的值
实参将数据传递给形参,传递方向是单向的,即若形参发生了改变不会影响实参
练习:
(1)定义函数计算m~n的数据之和
function getSum(m, n) {
var sum = 0
for (var i = m; i <= n; i++) {
sum = sum + i
}
return sum
}
("1+2+3...+100=", getSum(1, 100))
('10+11+12+...+50', getSum(10, 50))
(2)定义一个函数判断一个数是否是素数。输出100以内的所有素数
function sushu(n) {
for (var i = 2; i < n; i++) {
if (n % i === 0) {
break;
}
}
if (i >= n) {
return n
}
}
for (var k = 1; k <= 100; k++) {
if (sushu(k)) {
(k)
}
}
(3)定义一个函数判断其是否是'水仙花'数.输出1000以内的所有'水仙花'数
function shuixian(n) {
var n, a, b, c
a = parseInt(n / 100);
b = parseInt((n - 100 * a) / 10);
c = parseInt(n % 10);
if (n == a * a * a + b * b * b + c * c * c) {
return n
}
}
for (var i = 100; i < 1000; i++) {
if (shuixian(i)) {
(i)
}
}
函数就是程序模块,建议函数的功能尽量单一化
耦合:模块之间结合的紧密程度
内聚:模块内部结合的紧密程度
在项目中模块之间应该是高内聚、低耦合
关于函数的参数:形参和实参的个数可以不同
当实参数量多于形参数量时,函数正常执行,多余的实参会被忽略
B、当实参数量小于形参数量时,多出来的形参类似于一个已声明未赋值的变量,
其值为undefined
C、arguments的使用
在定义函数时,每个函数都有一个隐含的内置对象arguments
在该对象中保存了函数调用时传递的所有实参
ps:
利用函数求任意数组中的最大值
利用return提前终止函数
利用return返回数组
利用函数对反转数组元素
5.函数表达式
将声明的函数赋给一个变量,通过变量完成函数的调用和参数传递
var 变量名=function([参数]){
函数体语句
}
6.回调函数
指的就是一个函数A作为参数传递给一个函数B,然后在B的函数体内调用函数A。此时,称函数A为回调函数。
function cal(num1,num2,fn){//fn是函数
return fn(num1,num2)//调用fn函数,num1、num2作为参数
}
function add(a,b){
return a+b
}
var t=cal(12,25,function(a,b){
return a+b
})
(t)
7.函数的递归调用
函数自己调用自己
function fun(n){//用于计算n!
if(n===1 || n ===0){//递归的结束条件
return 1
}else{
return n*fun(n-1)//函数自己调用自己
}
}
(fun(5))
(1)用递归解决问题的前提条件
A、问题可以分解:即可以将复杂问题分解成相对简单的问题
B、分解后得到一个新问题,新问题的解法与原问题的解法相同
C、分解问题时必须有明确的结束条件
(2)递归的过程
第一步:自上而下分解问题
第二步:自下而上回溯得到问题的解
8、递归调用示例
(1)定义递归函数:输出斐波拉契数列的前20项
1 1 2 3 5 8 13 21...
A、第一项、第二项都是1
B、从第三项开始,每项的值等于前两项之和
function fib(n){
if(n===1 || n===2){
return 1
}else{
return fib(n-1)+fib(n-2)
}
}
var str = ''
for(var i=1;i<=20;i++){
str += fib(i)+'\t'
}
(str)
(2)用递归函数计算1+2+3+...+100的值
function sum(n){
if(n===1){
return 1
}else{
return n+sum(n-1)
}
}
var s
var i = 100
s = sum(i)
(s)
(3)定义递归函数打印一个整数的每一位数字
function num(n) {
if (n > 9) {
num(parseInt(n / 10))
}
(parseInt(n % 10))
}
num(1024)
三、作用域的分类
1.作用域:作用范围
2.全局变量
var sum = 0//全局变量:在函数外部定义,是显示定义,在整个程序中都起作用
function getSum(n){
sum = 0//全局变量:在函数内部没有使用var声明的变量,属于隐式定义
for(var i=1;i<=n;i++){
sum += i
}
}
//var sum = 1//全局变量:会把sum的作用域进行提升
getSum(100)
(sum)//在函数外部访问sum,因为sum是全局变量
(1)在函数外部定义的变量
(2)在函数内部省略var关键字,声明的变量
3.局部变量
在函数内部使用var关键字声明的变量。只在函数内部有效
4.块级变量
在ES6(ECMAScript6)标准中提出的。是用户let声明的变量,只在语句块({})中有效
5.作用域链
当在一个函数内部声明另一个函数时,内层函数只能在外层函数作用域内执行,在内层函数执行的过程中,若需要引入某个变量,首先会在当前作用域中寻找,若未找到,则继续向上一层级的作用域中寻找,直到全局作用域,称这种链式的查询关系为作用域链。
var s = 0
function text(){
var t = 1
var fun = function(){
t++
s += t
}
fun()
}
text()
(s)
六、闭包函数
简称"闭包",指的是有权访问另一个函数作用域内的变量(局部变量)的函数
function fn(){
var times = 0//局部变量:作用域为fn函数
var c = function(){//函数表达式:是一个闭包函数,在他的内部访问了fn函数的局部变量times
return ++times
}
return c//返回的是闭包函数
}
var count = fn()//函数表达式
('第一次调用',count())
('第二次调用',count())
('第三次调用',count())
('第四次调用',count())
1.作用
(1)可以在函数外部读取函数内部的变量(局部变量)
(2)可以让函数内部局部变量的值始终保存在内存中
2、闭包的优缺点、闭包中作用域链的体现
七、立即调用的函数表达式
即立即调用匿名函数。
1.格式
(function([参数]){ //匿名函数
函数体语句
})(); //立即调用
(function(){
var sum = 0
for(let i=1;i<=100;i++){
sum += i
}
('1+2+3+...+100=',sum)
})()
*/
2.练习题
定义函数,计算如下数列的前20项之和:2/1、3/2、5/3、8/5...
(function(){
var sum = 0
var a = 1
var b = 2
for(var i=1;i<=20;i++){
sum = sum + b/a
temp = b
b = a + b
a = temp
}
(sum)
})()