定义函数的方式

1、函数声明

function 函数名(){
     //函数体
     }

2、函数表达式

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

定义函数实例:

//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();

函数自调用

function 函数名(){
    //函数体
}
函数名();
//用第二种
(function(){
    //函数体
})();

函数自调用实例:

//函数自调用不会冲突
(function (){
	console.log('hahahahaha');
})();
(function (){
	console.log('yayayayaya');
})();

函数的数据类型

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

查看函数数据类型实例:

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

回调函数

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

回调函数实例:

//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();

作用域

作用域实例:

//作用域:使用范围
//全局变量:声明的变量是使用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);

隐式全局变量

隐式全局变量实例:

//声明的变量没有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是会被删除的

作用域链

作用域链实例:

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();

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

预解析

预解析实例:

//预解析:提前解析代码
//预解析可以把变量的声明提前,赋值不会提前
var num;//相当于定义变量
console.log(num);
var num=10;
//预解析可以把函数的声明提前
fg();
var num=20;
function fg(){
	var num;//相当于定义变量
	console.log(num);
	var num=100;
}

长风破浪会有时,直挂云帆济沧海。