函數知多少(一)

從定義函數提及

如何定義函數?

通常來講,定義函數的方式有兩種,分別是函數聲明函數表達式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,分享文章的那些人,正是大家樂於分享,才讓更多的開發者可以瞭解到更普遍的知識。另外,做者做爲前端新兵,本文確定有不當之處,歡迎批鬥~~~

相關文章
相關標籤/搜索