1. 函数
1.1 函数概念
- 函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的 重复使用。
// 不用函数
求 1~10的累加和
var sum = 0;
for (var i = 1; i <=10; i++) {
sum += i;
}
console.log(sum);
//使用函数
//函数就是封装了一段可以被重复执行调用的代码块 目的: 就是让大量代码重复使用
function getSum(num1, num2) {
var sum = 0;
for (var i = num1; i <= num2; i++) {
sum += i; }
console.log(sum); }
getSum(1, 5);
getSum(1, 10);
1.2 函数的声明
声明函数
function 函数名() {
函数体代码
}
- function 是声明函数的关键字,必须小写
- 由于函数一般是为了实现某个功能才定义的, 所以通常我们将函数名命名为动词,函数名:驼峰命名法 动词;比如 getSum
1.3 函数的调用
调用函数 函数名();
通过调用函数名来执行函数体代码
- 调用的时候千万不要忘记添加小括号
- 口诀:函数不调用,自己不执行
- 注意:声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码。
定义函数的两种方式区别:
- 函数声明式,调用的时候可以放在函数定义的上面或者下面
printSjx();
function printSjx() {
document.write('<table>')
for (var i = 1; i <= 9; i++) {
document.write('<tr>')
for (var j = 1; j <= i; j++) {
document.write('<td>'+i+'*'+j+'='+i*j+'</td>')
document.write(`<td>${i}*${j}=${i * j}</td>`)
}
document.write('</tr>');
}
document.write('</table>')
}
- 表达式声明法:调用时只能写在函数定义的下面,放在上面会报错
printSanJiaoXing();
var printSanJiaoXing = function(){
document.write('<table>')
for (var i = 1; i <= 9; i++) {
document.write('<tr>')
for (var j = 1; j <= i; j++) {
document.write('<td>'+i+'*'+j+'='+i*j+'</td>')
document.write(`<td>${i}*${j}=${i * j}</td>`)
}
document.write('</tr>');
}
document.write('</table>')
}
1.4 函数的参数
- 函数参数语法
形参:函数定义时设置接收调用时传入
实参:函数调用时传入小括号内的真实数据
参数的作用 : 在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去。
函数参数的运用:
1.调用的时候实参值是传递给形参的
2.形参简单理解为:不用声明的变量
3.实参和形参的多个参数之间用逗号(,)分隔
- 函数形参和实参数量不匹配时
1.形参和实参个数相同时,参数赋值会一一对应
2.形参个数>实参个数: 没有给赋值的形参,值为undefined
3.实参的数>形参个数:可以通过arguments来获取传入的实参
小结:
1.函数可以带参数也可以不带参数
2.声明函数的时候,函数名括号里面的是形参,形参的默认值为 undefined
3.调用函数的时候,函数名括号里面的是实参
4.多个参数中间用逗号分隔
5.形参的个数可以和实参个数不匹配,但是结果不可预计,我们尽量要匹配
1.6 函数的返回值
-
return 语句
返回值:函数调用整体代表的数据;函数执行完成后可以通过return语句将指定数据返回 。
我想把的到的这个和,存起来,下次还能用
return 只能返回一个值 -
比如:
function getSum(x,y){
return x+y;
}通过return 关键字返回出来的结果,函数调用时,结果就可以被保存起来
var sum = getSum(10,23);//把结果保存在sum变量中
带return的函数,函数调用的结果是一个值,可以直接输出,也可以存到变量中
console.log(sum);
function getA(){
return ‘zs’
}
函数如果带return了,函数调用的结果是 一个值,可以直接输出,也可以保存到变量里
console.log(getA());
var x = getA()
console.log(x);
1.7 arguments的使用
- 当不确定有多少个参数传递的时候,可以用 arguments 来获取。
每一个函数内部都会有一个叫arguments:它会记录你传递过去的所有实参
arguments: [2, 3, 6, 4, 5]
arguments[0] arguments[1] arguments[2] arguments[3] arguments[4]
length:长度(个数)
arguments.length:传入实参的个数
arguments[aruments.length-1]: 传入参数的最后一号元素
2.1作用域
-
作用域:代码的作用范围,一段代码起作用的区域
全局作用域: 在函数外面定义的变量 全局位置定义的变量称为全局变量, 会保存在一个叫window对象里面 全局变量的生命周期:页面一打开变量就起作用了,页面已关闭,变量就起作用了
- 全局作用域里面定义的变量,哪哪都能访问
var n = 20;
console.log(n);//20
function fn() {
console.log(n);
}
fn();//20
console.log(n);//20
-
局部作用域定义的变量,只能在函数作用域内部使用,外部访问不到
局部变量的声明周期:函数调用时产生,函数调用结束消失
function fn(){
var n = 10;
}
fn();
console.log(n);//n is not defined
- js中 不是所有的{}都用于作用域 像 if(){} for(){} while(){}不能形成作用域
if (true) {
var n = 20;
}
console.log(n);//20
for(var i=1 ;i<=10;i++){ }
console.log(i); // 11
2.2 变量的赋值和访问规则
变量的访问(获取)规则:
- 局部位置访问变量时,就近原则:先找局部作用域下的变量,找到就不找了,如果局部作用域里面没有,向上找,直到全局都没有,就报错
var x = 10;
function fn(){
var x = 20;
console.log(x); //20
}
fn();
var x = 10;
function fn(){
console.log(x);//10
}
fn();
function fn(){
console.log(x); // x is not defined
}
fn();
- 变量的赋值(获取)规则: 遵循就近赋值
var x = 10;;
function fn() {
var x = 20; //初始值
x = 30; //重新赋值
console.log(x); // 30
}
fn();
console.log(x); // 10
- 赋值也好,访问也好,先找局部,再找全局
var x = 10;; //初始值
function fn() {
x = 30; // 先找一找 函数内部有没有定义局部变量x, 向上找,找了一个叫x的变量 , 全局位置的x已经被重新赋值了 x = 30;
console.log(x); //30
}
fn();
console.log(x); //30