函数知多少(一)

从定义函数提及

如何定义函数?

通常来讲,定义函数的方式有两种,分别是函数声明函数表达式javascript

//函数声明
function foo1() {
    console.log("hello");
}

//函数表达式
var foo2 = function () {
    console.log("javascript");
}

第一次使用的时候并无以为这二者有什么特别的差异,那咱们来试试在最前面加入执行函数的代码,是最前面哦。前端

foo1();
foo2();

定义函数
执行一下,WTF!怎么报错了,咱们看看错误是什么?Uncaught TypeError: foo1 is not a function,OK,咱们来设置断点来分析一下,这里,咱们把foo1foo2加入监视窗口;咱们能够看到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,分享文章的那些人,正是大家乐于分享,才让更多的开发者可以了解到更普遍的知识。另外,做者做为前端新兵,本文确定有不当之处,欢迎批斗~~~

相关文章
相关标签/搜索