先说点javascript中关于函数的基本概念。
为了便于理解,可复制代码片段到浏览器的控制台中执行。
1. 函数的创建方法
JS中创建一个函数有2种方式,函数定义表达式 + 声明式。如下:
定义表达式: var fun1 = function(){ var a="demo"; console.log(a) };
声明式: function fun2(){ var a="demo"; console.log(a);}
运行 fun1() 和 fun2(),都会得到相同的结果,说明两个函数基本的功能相同。
当然也可以混合着使用,但不建议,因为这相当于用两个碗吃饭,浪费。
var fun1 = function fun2(){var a="demo"; console.log(a);}
2. 声明提前
JS代码的执行是自上而下按顺序逐句执行的,这和我们做事情一样。或许你会说有人可以同时做两件事,比如说边看书边听歌。看书用的是眼睛,听歌用的是耳朵,眼睛和耳朵之于人体的作用,类似于摄像头和麦克风之于电脑,是信息输入的工具。我们看书看到的文字以及听歌听到的声音,都要交给我们的大脑处理。大脑分很多部位,如左脑右脑,不同的部位善于处理的信息不同。这点和电脑的CPU也很像。
上面有点啰嗦了。请看下面的代码。
fun3();
function fun3(){var c="demo";console.log(c);}
这个代码是可以正常执行的。
fun4();
var fun4 = function(){var d="demo"; console.log(d);}
这段是不可以执行的,会提示Uncaught TypeError : fun4 is not a function;
那么把这段代码稍作修改。
var fun5;
fun5();
fun5 = function(){var d="demo"; console.log(d);}
你会发现代码仍然不能正常执行,提示的错误和之前类似。那么为什么fun3()就可以正常执行呢?
这就是因为声明提前。JS在执行时,对于声明式创建的函数,自动会放到代码的最前面。根据《权威指南》的说法,是函数声明语句“被提前”到外部脚本或外部函数作用域的顶部,所以以这种方式声明的函数,可以被在它定义之前出现的代码所调用。