14函数
# 函数
# 函数的创建方式
长方形的面积 = 长 * 宽 //形式参数
50 = 10 * 5 //实际参数
function fn(形参){执行的内容}
1
# 1、一个叫fn的函数
function fn(a, b) {
console.log(a * b);
}
fn(10, 5) //50=10*5
1
2
3
4
2
3
4
# 2、一个函数然后赋值给fn
var fn = function (a, b) {
console.log(a * b);
}
fn(10, 5) //50=10*5
1
2
3
4
2
3
4
# 3、一个匿名函数
(function (a, b) {
console.log(a * b);
})(10, 5) //50=10*5
1
2
3
2
3
# 4、一个匿名函数
!function (a, b) {
console.log(a * b);
}(10, 5) //50=10*5
1
2
3
2
3
# 函数的属性
# 属性
function fn() {
console.log(arguments);
}
fn(1, 2, 3, 4, 5)//[1, 2, 3, 4, 5, callee: ƒ, Symbol(Symbol.iterator): ƒ]
1
2
3
4
2
3
4
# 属性转数组
function fn() {
console.log([...arguments]);
}
fn(1, 2, 3, 4, 5)//[1, 2, 3, 4, 5]
1
2
3
4
2
3
4
# 关键字
function fn(a, b) {
console.log(this)//当前所在的作用域对象window
return//返回值
}
fn(1, 2)
// {window: Window, self: Window, document: document, name: "", location: Location, …}
1
2
3
4
5
6
2
3
4
5
6
function fn(a, b) {
return a * b
}
console.log(fn(10, 5)); //50=10*5
1
2
3
4
2
3
4
# 函数复用性
function fn(a, b) {
return a * b
}
fn(10, 5)
fn(20, 10)
1
2
3
4
5
2
3
4
5
# 作用域
局部作用域可以访问全局作用域
但是全局作用域正常情况下访问不了局部作用域
例如:你在外面想看别人家洗澡是看不到了。哪里面的人就可以看的了外咯
var a = 1//在函数外声明的变量称为全局作用域
function fn(){
var a = 2//在函数里面声明的变量称为局部作用域
}
1
2
3
4
5
2
3
4
5
var a = 1//全局变量
function fn() {
console.log(a);//可以打印
}
fn()
function fn() {
var a = 1//局部变量
}
fn()
console.log(a);//不可以打印
// 总结:函数里面可以访问函数外面,但是反过来不行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1、没有声明就是上面的a
var a = 1
function fn1() {
a = 2 //没有声明就是上面的a
}
fn1()
console.log(a);//2
1
2
3
4
5
6
2
3
4
5
6
# 2、声明之后跟上面的a没有关系
var a = 1
function fn1() {
var a = 2//声明之后跟上面的a没有关系
}
fn1()
console.log(a);//1
1
2
3
4
5
6
2
3
4
5
6
var a = 1
function fn1() {
console.log(a);//undefined
var a = 2
console.log(a);//2
}
fn1()
console.log(a);//1
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 闭包特性
函数闭包
闭包可以访问其他函数的作用域的数据,这个函数就被称为闭包
闭包实际上并没有让变量累加,累加靠的是垃圾回收机机制没有回收变量数据
闭包有什么用
1、获取局部变量的值
2、避免全局变量污染
3、用来做类的私有属性
function fn() {
var a = 1;
return function fn2() {
//这个是闭包
console.log(++a);
};
}
var afn = fn();
afn(); //2
afn(); //3
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 加强记忆、
function fn() {
var a = 1
return function fn2() {//这个是闭包
var b = 1
return function fn3() {//这个是闭包
console.log(++b);
}
}
}
var afn = fn()() //实际这里就多加的括号
afn()//2
afn()//3
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
//闭包
//闭包在使用的时候,能暂时性的存储数据到内存里面,如果是低版本浏览器(ie5-ie7)
//就会出现内存泄漏问题,导致越来越卡,而新版本的浏览器比如chrome就不会有这种问题
function fn(){
let a = 1
function fn2(){
return ++a
}
return fn2
}
let f = fn()
console.log(f())//2
console.log(f())//3
console.log(f())//4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
编辑 (opens new window)
上次更新: 2022/04/24, 13:33:34