摘要:從定義函數(shù)說起如何定義函數(shù)一般來說,定義函數(shù)的方式有兩種,分別是函數(shù)聲明和函數(shù)表達式。我們聲明了一個變量,接著又定義了一個函數(shù),我們通過監(jiān)視窗口發(fā)現(xiàn)一直被定義成了一個函數(shù),顯然,函數(shù)聲明的優(yōu)先級高于變量聲明。
從定義函數(shù)說起 如何定義函數(shù)?
一般來說,定義函數(shù)的方式有兩種,分別是函數(shù)聲明和函數(shù)表達式。
//函數(shù)聲明 function foo1() { console.log("hello"); } //函數(shù)表達式 var foo2 = function () { console.log("javascript"); }
第一次使用的時候并沒有覺得這兩者有什么特別的差別,那我們來試試在最前面加入執(zhí)行函數(shù)的代碼,是最前面哦。
foo1(); foo2();
執(zhí)行一下,WTF!怎么報錯了,我們看看錯誤是什么?Uncaught TypeError: foo1 is not a function,OK,我們來設(shè)置斷點來分析一下,這里,我們把foo1和foo2加入監(jiān)視窗口;我們可以看到foo1函數(shù)執(zhí)行之前就已經(jīng)獲得了定義,而foo2函數(shù)卻顯示未定義,到這里我們就明白了。但是為什么foo1就生效了呢?我們來說說聲明提升。
剛才我們在一開始調(diào)用foo1的時候發(fā)現(xiàn)該函數(shù)已經(jīng)被定義了,證實了采用聲明形式定義的函數(shù)有聲明提升的特征,何為聲明提升?即可以在定義該函數(shù)之前調(diào)用。而采用表達式形式定義的函數(shù)只能順序執(zhí)行,你不能在定義該函數(shù)之前調(diào)用(大家可以自己試試把調(diào)用函數(shù)的代碼放在不同位置,以及調(diào)換兩個函數(shù)的位置)。
接下來我們通過另一段代碼,來看看函數(shù)聲明和變量聲明。
var foo; function foo() { console.log("hello javascript"); } foo();
我們聲明了一個變量foo,接著又定義了一個函數(shù)foo,我們通過監(jiān)視窗口發(fā)現(xiàn)foo一直被定義成了一個函數(shù),顯然,函數(shù)聲明的優(yōu)先級高于變量聲明。真的是這樣嗎?把上面的代碼稍微改造一下。
var foo = "1"; function foo() { console.log("hello javascript"); } foo();
執(zhí)行一下,咦?又報錯了,Uncaught TypeError: foo is not a function,在執(zhí)行var foo = "1"之后,監(jiān)視器寫著foo: "1",我們聲明的函數(shù)被變量覆蓋了,到這里我們可以得到結(jié)論了,經(jīng)過初始化的變量聲明優(yōu)先級高于函數(shù)聲明。
關(guān)于參數(shù)在函數(shù)中引入?yún)?shù),想必大家肯定很熟悉了。
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
我們都知道在函數(shù)內(nèi)部的改變?nèi)肿兞康闹祵ν獠渴遣豢梢姷模拖裆厦娴拇a,我們在函數(shù)內(nèi)部改變str的值,對外部毫無影響?,F(xiàn)在我們把參數(shù)換成對象試試會怎樣。
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
漲知識了,如果參數(shù)是對象,在函數(shù)內(nèi)部對該對象做出的改變對外部是可見的。
課后題?function foo() { } foo(); var foo = function () { }
foo()執(zhí)行的是哪個函數(shù)呢?把三段代碼的位置調(diào)換一下又會有是什么情況呢?大家可以自己研究一下。
寫在最后昨天開始打算寫這篇文章之前,本以為很好理解的,然而自己就被第一個定義函數(shù)的方式卡了很久,之前聽室友講維護一個blog就夠累的了,還錄制教學視頻、維護個人網(wǎng)站?當時還不覺得,結(jié)果輪到自己上手寫文章的時候才發(fā)現(xiàn)真的很不容易,真的很佩服一直堅持寫blog,分享文章的那些人,正是你們樂于分享,才讓更多的開發(fā)者能夠了解到更廣泛的知識。另外,作者作為前端新兵,本文肯定有不當之處,歡迎批斗~~~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86234.html
摘要:前言上次聊了關(guān)于定義函數(shù)的知識,還有參數(shù)方面的,這次先補充一點參數(shù)小知識,還有簡單的講一下閉包。在這里,函數(shù)包含了一個內(nèi)部函數(shù),所以可以使用引入的參數(shù)。我們把函數(shù)作為返回值賦給,當然,同時返回的還有。 前言 上次聊了關(guān)于定義函數(shù)的知識,還有參數(shù)方面的,這次先補充一點參數(shù)小知識,還有簡單的講一下閉包。 arguments對象 引入的參數(shù)會保存在arguments數(shù)組對象中,第一個引入的參...
摘要:關(guān)鍵字在中的變化非常的靈活,如果用的不好就非常惡心,用的好程序就非常的優(yōu)雅,靈活,飄逸所以掌握的用法,是每一個前端工程師必知必會的而且這個也是一些大公司筆試中常見的考察項第一種單獨的,指向的是這個對象注當前的執(zhí)行環(huán)境是所以指向了第二種全局函 this關(guān)鍵字在javascript中的變化非常的靈活,如果用的不好就非常惡心,用的好,程序就非常的優(yōu)雅,靈活,飄逸.所以掌握this的用法,是每...
摘要:數(shù)組中的元素自動前移,比慢的多。該方法接受一個返回值為布爾類型的函數(shù),對數(shù)組中得每個元素使用該函數(shù),如果對于所有的元素,該函數(shù)都返回則該方法返回。 數(shù)組的維基百科定義是: 在編程語言中,數(shù)組數(shù)據(jù)結(jié)構(gòu)(英語:array data structure),簡稱數(shù)組(英語:Array),是一種數(shù)據(jù)結(jié)構(gòu),是數(shù)據(jù)元素(elements)的集合。元素可以通過索引來任意存取,索引通常是數(shù)字,用來計算元...
摘要:正確的解釋是允許在相等比較中進行強制類型轉(zhuǎn)換,而不允許。參考資料小議下字符串比較大小中的強制類型轉(zhuǎn)換核心概念類型轉(zhuǎn)換對象和方法隱式類型轉(zhuǎn)換小結(jié) 開胃菜 先說一個題外話,我在工作中遇到一個問題,需要比較 08:00 和 09:00 的大小,最后我找到三種方法: 在兩個字符串前后各拼接相同的年月日和秒,拼成完整的時間格式進行比較: var head = 2016-01-01 var fo...
閱讀 898·2023-04-25 19:17
閱讀 2199·2021-09-10 11:26
閱讀 1913·2019-08-30 15:54
閱讀 3434·2019-08-30 15:53
閱讀 2689·2019-08-30 11:20
閱讀 3406·2019-08-29 15:12
閱讀 1241·2019-08-29 13:16
閱讀 2398·2019-08-26 12:19