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