函数进阶


定义函数的方式

1、函数声明

1
2
3
function 函数名(){
//函数体
}

2、函数表达式

把一个函数给一个变量,此时形成了函数表达式
var 变量=匿名函数

定义函数实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//1.
function f1(){
console.log('hello');
}
f1();
console.log(f1);
//2.
var f1=function(){
console.log('hello');
}
f1();
//3.函数声明如果出现两个一样的函数:下边的变量会覆盖上边的变量
function f1(){
console.log('hello');
}
f1();
function f1(){
console.log('hello world');
}
f1();
//4.函数表达式,两个一样的函数会同时输出,不会覆盖掉
var f2=function(){
console.log("hi");
}
f2();
var f2=function(){
console.log("hello");
}
f2();

函数自调用

1
2
3
4
5
6
7
8
function 函数名(){
//函数体
}
函数名();
//用第二种
(function(){
//函数体
})();

函数自调用实例:

1
2
3
4
5
6
7
//函数自调用不会冲突
(function (){
console.log('hahahahaha');
})();
(function (){
console.log('yayayayaya');
})();

函数的数据类型

1
2
3
4
5
6
function f1(){
console.log("我是函数");
}
//如何获取某个变量的类型:typeof
console.log(typeof f1);
//函数是有数据类型的,为function类型

查看函数数据类型实例:

1
2
3
4
5
//说明函数也是一种数据类型-function
function f3(){
console.log('你好');
}
console.log(typeof f3);

回调函数

函数A作为参数传递到另一个函数B中,并且这个函数B执行函数A,就说函数A叫做回调函数

回调函数实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//1、函数可以作为参数使用
function f4(x,y){
console.log(x+y);
}
f4(10,20);
function f5(x,y){
console.log(x+y);
}
f5('hello','你好');
function f6(x){
console.log(x);
}
f6(true);
function f7(fn){
fn();
}
function f8(){
console.log('我是回调函数');
}
f7(f8);//f8()调用之后的返回值扔到括号里了,就不是函数了,调用就没有意义
//2、函数可以作为返回值来使用
function fa(){
console.log('被调用';)
return function(){
console.log('这是函数');
}
}
var ff=fa();//ff已经不是变量,是函数
ff();

作用域

作用域实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//作用域:使用范围
//全局变量:声明的变量是使用var声明的,那这个变量就是全局变量,全局变量在页面的任何部分都可以使用
//局部变量:在函数定义是我变量,外部并不能使用
//全局作用域:就是全局变量的使用范围
//局部作用域:就是局部变量的使用范围
//块级作用域:一对大括号看成一块,在里面定义变量
//结论:在块级中定义的变量,外面也能用。JS没有块级作用域,但是函数除外
{
var num=10;
console.log(num);
}
console.log(num);
if(true){
var num=20;
}
console.log(num);
for(i=0;i< 5;i++){
var num=30;
}
console.log(num);
function f9(){
var num=56;
}
f9();
console.log(num);

隐式全局变量

隐式全局变量实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//声明的变量没有var,就叫隐式全局变量
num=1;
console.log(num);
function fb(){
num=100;
}
fb();
console.log(num);
console.log(num);
var a=1;
a2=2;
delete a1;
delete a2;
console.log(typeof a1);
console.log(typeof a2);
//隐式全局变量是可以被删除的,全局变量不能被删除
//定义变量使用var是不会被删除的,没有var是会被删除的

作用域链

作用域链实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var num=100;//在script标签里面定义的变量就是0级作用域
function fc(){
var num=20;
function fd(){
var num=30;
function fe(){
var num=50;
console.log(num);
}
fe();
}
fd();
}
fc();

作用域链:沿着作用域链一级一级的搜索的过程,搜索过程始终从作用域链底端开始,然后逐级向上回溯,直到找到为止(如果找不到,通常会报错)。

预解析

预解析实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
//预解析:提前解析代码
//预解析可以把变量的声明提前,赋值不会提前
var num;//相当于定义变量
console.log(num);
var num=10;
//预解析可以把函数的声明提前
fg();
var num=20;
function fg(){
var num;//相当于定义变量
console.log(num);
var num=100;
}

文章作者: COOL
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 COOL !
评论
  目录