从定义函数提及
如何定义函数?
一般来说,定义函数的体式格局有两种,分别是函数声明和函数表达式。
//函数声明
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
就见效了呢?我们来说说声明提拔。
声明提拔
适才我们在一最先挪用foo1的时刻发明该函数已被定义了,证清楚明了采纳声明情势定义的函数有声明提拔的特性,作甚声明提拔?即可以在定义该函数之前挪用。而采纳表达式情势定义的函数只能递次实行,你不能在定义该函数之前挪用(人人可以本身尝尝把挪用函数的代码放在差别位置,以及换取两个函数的位置)。
接下来我们经由过程另一段代码,来看看函数声明和变量声明。
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"
,我们声明的函数被变量覆蓋了,到这里我们可以获得结论了,经由初始化的变量声明优先级高于函数声明。
关于参数
在函数中引入参数,想必人人一定很熟悉了。
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
的值,对外部毫无影响。如今我们把参数换成对象尝尝会如何。
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,分享文章的那些人,恰是你们乐于分享,才让更多的开发者可以相识到更普遍的学问。别的,作者作为前端新兵,本文一定有不当之处,迎接批斗~~~