目录
函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。
命名函数(函数声明):如果函数有名字,就是命名函数

匿名函数(函数表达式):如果函数没有名字,就是匿名函数

- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- //命名函数(函数声明)
- function f1(){
- console.log('我是命名函数');
- }
-
- //命名函数调用
- f1();
-
- //匿名函数(函数表达式)
- var f2 =function (){
- console.log('我是匿名函数');
- }
-
- //匿名函数调用
- f2();
-
- script>
- body>
- html>
函数声明
function 函数名 () { //函数体 }
函数表达式
var 变量 = 匿名函数 ;
把一个函数给一个变量,此时形成了函数表达式
函数声明和函数表达式二者区别:
在页面中有两个同名的命名函数,后面的一个命名函数会覆盖前面的命名函数
在页面中有两个同名的匿名函数,后面的匿名函数不会覆盖前面的匿名函数
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- function f1() {
- console.log("哈哈哈");
- }
- f1();
-
- function f1() {
- console.log("你好");
- }
- f1();
-
- //如果在页面中有两个同名的命名函数,后面的一个命名函数会覆盖前面的命名函数
-
- var f2 = function() {
- console.log("函数表达式");
- };
- f2();
- var f2 = function() {
- console.log("函数声明");
- };
- f2();
- //如果在页面中有两个同名的匿名函数,后面的匿名函数不会覆盖前面的匿名函数
- script>
- body>
- html>

声明函数的同时进行调用
语法:

- function 函数名() {
- //函数体
- }
- 函数名();
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- //先声明函数
- function f1(){
- console.log("先声明函数,再调用");
- }
-
- f1();
-
- //声明函数的同时进行调用
- (function f2(){
- console.log('声明函数的同时调用函数');
- })();
-
-
- script>
- body>
- html>

函数是有数据类型,它的数据类型是:function
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- function f1(){
- console.log('qwert');
- }
-
- //输出函数的数据类型
- console.log(typeof f1);//function
-
- var f2 = function (){
- console.log('asdfg');
- }
-
- console.log(typeof f2);//function
-
- script>
- body>
- html>

任何数据类型都可以作为参数,函数也可以叫做回调函数
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- function f1(x,y) {
- console.log(x+y);
- }
- f1(10,20);
- f1('hello','java');
- f1('123',123);
-
- function f3(x) {
- console.log(x);
- }
- f3(true);
-
-
- script>
- body>
- html>

任何数据类型都可以作为返回值,函数也可以
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- function f1() {
- console.log("f1函数调用了");
- return function() {
- console.log("我是f1函数里return返回的结果");
- };
- }
-
- //ff是一个匿名函数
- var ff=f1();
-
- ff();
- script>
- body>
- html>

函数A作为参数传递到另一个函数B中,并且这个函数B执行函数A。就说函数A叫做回调函数
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
-
-
- //回调函数:在一个函数中去调用另外一个函数,调用的这个函数是由参数传递过来的
- function f1(fn){
- console.log('我是f1函数里的输出语句');
- fn();
- }
- function f2(){
- console.log("我是回调函数哦~");
- }
- f1(f2);
-
-
-
-
- script>
- body>
- html>
作用域:作用域就是在这一个区域内有作用(使用范围)
块级作用域:一对大括号就可以看成是一块
JS中没有块级作用域,但是函数除外
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- {
- var num = 100;
- console.log(num);
- }
-
- console.log(num);
-
- if(true){
- var num2 =200;
- console.log(num2);
- }
-
- console.log(num2);
-
- for(var i = 1;i<=5;i++){
- var num3 = 300;
- console.log(num3);
- }
-
- console.log(num3);
-
- function f1(){
- var num4 = 400;
- console.log(num4);
- }
-
- f1();
-
- //JS没有作用域的概念,但是,函数中定义的变量只能在函数中使用
- // console.log(num4);
-
- function f2(){
- //没有使用var声明的变量自动升级为全局变量,在函数外也可以使用
- num5 =500;
- console.log(num5);
- }
- f2();
- console.log(num5);
-
- script>
- body>
- html>

全局变量:在函数外声明的变量,网页上的所有脚本和函数都能访问它
局部变量:在函数内部声明的变量(使用var),只能在函数内部访问它
可以在不同的函数中使用名称相同的局部变量
生存期:
局部变量在函数运行以后被删除
全局变量在页面关闭后被删除
全局变量和局部变量区别:作用域不同、声明位置不同、生存期不同
隐式全局变量:声明变量时没有使用声明变量的关键字
隐式全局变量是可以被删除的,但是全局变量是不能被删除的
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- var a1=1; //全局变量
- a2=2; //隐式全局变量
- delete a1;
- delete a2;
- console.log(a1);
- // console.log(a2);
-
- //隐式全局变量是可以被删除的,但是全局变量是不能被删除的
-
- console.log(typeof a1);//number
- console.log(typeof a2);//undefined
-
-
-
- script>
- body>
- html>
沿着作用域链一级一级地搜索的过程。搜索过程始终从作用域链底端开始,然后逐级向上回溯,直到找到为止(如果找不到,通常会报错)
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- var num = 10;
-
- function f1() {
- // var num = 20;
-
- function f2() {
- // var num = 30;
-
- function f3() {
- // var num = 50;
- console.log(num);
- }
- f3();
- }
- f2();
- }
- f1();
- script>
- body>
- html>
预解析就是预先解析function和var
变量的声明提前了----提前到当前所在的作用域的最上面
函数的声明也会被提前---提前到当前所在的作用域的最上面

- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <script>
- //先声明变量再使用
- var num =10;
- console.log(num);
-
- console.log(number);//underfined
- var number = 100;
-
- /*
- console.log(number);
- var number = 100;
- 等价于:
- var number;
- console.log(number);
- number = 100;
- */
-
- f1();
- function f1() {
- console.log(num);
- var num=10;
- }
-
-
- script>
- body>
- html>