通常来讲,定义函数的方式有两种,分别是函数声明和函数表达式。javascript
//函数声明 function foo1() { console.log("hello"); } //函数表达式 var foo2 = function () { console.log("javascript"); }
第一次使用的时候并无以为这二者有什么特别的差异,那咱们来试试在最前面加入执行函数的代码,是最前面哦。前端
foo1(); foo2();
执行一下,WTF!怎么报错了,咱们看看错误是什么?Uncaught TypeError: foo1 is not a function
,OK,咱们来设置断点来分析一下,这里,咱们把foo1
和foo2
加入监视窗口;咱们能够看到foo1
函数执行以前就已经得到了定义,而foo2
函数却显示未定义,到这里咱们就明白了。可是为何foo1
就生效了呢?咱们来讲说声明提高。java
刚才咱们在一开始调用foo1的时候发现该函数已经被定义了,证明了采用声明形式定义的函数有声明提高的特征,何为声明提高?便可以在定义该函数以前调用。而采用表达式形式定义的函数只能顺序执行,你不能在定义该函数以前调用(你们能够本身试试把调用函数的代码放在不一样位置,以及调换两个函数的位置)。
接下来咱们经过另外一段代码,来看看函数声明和变量声明。ide
var foo; function foo() { console.log("hello javascript"); } foo();
咱们声明了一个变量foo
,接着又定义了一个函数foo
,咱们经过监视窗口发现foo
一直被定义成了一个函数,显然,函数声明的优先级高于变量声明。真的是这样吗?把上面的代码稍微改造一下。函数
var foo = "1"; function foo() { console.log("hello javascript"); } foo();
执行一下,咦?又报错了,Uncaught TypeError: foo is not a function
,在执行var foo = "1"
以后,监视器写着foo: "1"
,咱们声明的函数被变量覆盖了,到这里咱们能够获得结论了,通过初始化的变量声明优先级高于函数声明。网站
在函数中引入参数,想必你们确定很熟悉了。spa
var str = "hello world"; (function foo(obj) { console.log("first inside:" + obj);//first inside:hello world obj = "hello javascript"; console.log("second inside:" + obj);//second inside:hello javascript }(str)); console.log("outside:" + str);//outside:hello world
咱们都知道在函数内部的改变全局变量的值对外部是不可见的,就像上面的代码,咱们在函数内部改变str
的值,对外部毫无影响。如今咱们把参数换成对象试试会怎样。code
var people = { age: 18, sex: "man", location: "hangzhou" }; (function foo(obj) { console.log("first inside:" + obj.age);//first inside:18 obj.age = 23; console.log("second inside:" + obj.age);//second inside:23 }(people)); console.log("outside:" + people.age);//outside:23
涨知识了,若是参数是对象,在函数内部对该对象作出的改变对外部是可见的。视频
function foo() { } foo(); var foo = function () { }
foo()
执行的是哪一个函数呢?把三段代码的位置调换一下又会有是什么状况呢?你们能够本身研究一下。对象
昨天开始打算写这篇文章以前,本觉得很好理解的,然而本身就被第一个定义函数的方式卡了好久,以前听室友讲维护一个blog就够累的了,还录制教学视频、维护我的网站?当时还不以为,结果轮到本身上手写文章的时候才发现真的很不容易,真的很佩服一直坚持写blog,分享文章的那些人,正是大家乐于分享,才让更多的开发者可以了解到更普遍的知识。另外,做者做为前端新兵,本文确定有不当之处,欢迎批斗~~~