函数(function)
函数的定义
函数作为常用数据类型中的复杂类型,一般我们可以把它理解成一个‘盒子’。当我们需要用它时直接调用就可。
函数的运用
对于函数运用,我们主要分成两个阶段,他们分别是:函数的定义阶段和函数的调用
1.函数的定义阶段
声明式
function fn() {
// 一段代码
}
赋值式
var fn = function () {
// 一段代码
}
2.函数的调用
声明式
function fn() {
console.log('我是 fn 函数')
}
// 调用函数
fn() //调用时也可用于定义函数前面
赋值式
var fn2 = function () {
console.log('我是 fn2 函数')
}
// 调用函数
fn2() //调用时不能放于定义函数前面(会报错)
函数的参数
函数的参数主要分为形参和实参
形参:定义函数时放于括号中,以‘,’隔开
实参:调用函数时放于括号中,以‘,’隔开
function fn(形参1,形参2,...) {
// 一段代码
}
fn(实参1,实参2....)
// 赋值式函数
var fn = function (行参1,形参2,...) {
// 一段代码
}
fn(实参1,实参2,...)
对于参数个数问题
1.形参个数大于实参个数
遵循一 一对应原则,实参多余的个数忽略不计,用不到。
function fn(num1, num2) {
// 函数内部可以使用 num1 和 num2
}
fn(100, 200, 300) //300用不到
2.实参个数大于形参个数
先遵行一 一对应原则,然后形参多出来的,以undefined处理
function fn(num1, num2, num3) {
// 函数内部可以使用 num1 num2 和 num3
//其中num3的值就是undefined
}
fn(100, 200)
函数中return
return 返回的意思,在函数中,常见两种:返回值和终断函数
返回值
function fn() {
// 执行代码
//return 100; 当输入时,输出值为100。若没有return输入,则输出undefined
}
// fn() 是一个表达式,这个表达式就没有结果出现
console.log(fn()) // undefined
终断函数
-
当我开始执行函数以后,函数内部的代码就会从上到下的依次执行
-
必须要等到函数内的代码执行完毕
-
而
return
关键字就是可以在函数中间的位置停掉,让后面的代码不在继续执行
function fn() {
console.log(1)
console.log(2)
console.log(3)
// 写了 return 以后,后面的 4 和 5 就不会继续执行了
return
console.log(4)
console.log(5)
}
// 函数调用
fn() //结果为1,2,3
预解析
- js 是一个解释型语言,就是在代码执行之前,先对代码进行通读和解释,然后在执行代码
- 也就是说,我们的 js 代码在运行的时候,会经历两个环节 解释代码 和 执行代码
**需要解析的内容有两个**
1. 声明式函数
在内存中先声明有一个变量名是函数名,并且这个名字代表的内容是一个函数
2.var
关键字
在内存中先声明有一个变量名
例如
fn()
console.log(num)
function fn() {
console.log('我是 fn 函数')
}
var num = 100
解析后
function fn() {
console.log('我是 fn 函数')
}
var num
fn()
console.log(num)
num = 100
总结过程:
1.把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
2.把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
3.先提升var,在提升function。
作用域
由于变量并不是在所有地方都能用,所以作用域产生了。
作用域主要分全局作用域和局部作用域
全局作用域
==>全局作用域是最大的作用域
==>在全局作用域中定义的变量可以在任何地方使用
==>页面打开的时候,浏览器就会自动给我们生成一个全局作用域window
==>这个作用域会一直存在,直到关闭页面就销毁了
==>在函数内部不使用var定义的变量是全局作用域
例如:
var num = 100;
var age = 12;
其中num,age就是全局作用域,在任何地方都能用。
局部作用域
==>局部作用域就是在全局的作用域下面又开辟出来的一个相对小一些的作用域
==>在局部作用域中定义的变量只能作用在这个局部作用内部使用
==>在js中只有函数能生成一个局部作用域,别的都不行
==>每一个函数,都是一个局部作用域
例如:
function fn(){
//下面这个变量就是一个fn局部作用域内部的变量,只能在fn函数内部使用
var num2 = 200;
//在函数内部不使用var定义的变量是,全局作用域
num1 = 340;
}
fn();//调用函数fn,fn里面的代码就运行了
// console.log(num2);//报错:num2 is not defined
console.log(num1);
预解析与作用域举例
f1();
console.log(c); //9
console.log(b); //9
console.log(a); //a is not defined
function f1() {
var a = b = c = 9;
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
分析
第一步:预解析
function f1() {
var a = b;
c = 9;
b=c;
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
第二步:执行
- 当运行到**f1()时,通过f1()**执行函数,此处函数里面的代码才开始执行。
- 其中c没有使用var定义,所以他是一个全局变量,b也没有使用var定义,所以他也是一个全局变量,a使用了var定义,并且在函数里面,所以他是一个局部作用域。
- 此时到了函数的外面,那么函数里面定义的局部变量就无法使用了
- 故:
console.log(c); //9
console.log(b); //9
console.log(a); //a is not defined
总结
复杂数据类型-函数已经写完,后续还将更新数组,对象等类型。有错误,望大家积极指正!!!