摘要:從定義函數說起如何定義函數一般來說,定義函數的方式有兩種,分別是函數聲明和函數表達式。我們聲明了一個變量,接著又定義了一個函數,我們通過監視窗口發現一直被定義成了一個函數,顯然,函數聲明的優先級高于變量聲明。
從定義函數說起 如何定義函數?
一般來說,定義函數的方式有兩種,分別是函數聲明和函數表達式。
//函數聲明 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,分享文章的那些人,正是你們樂于分享,才讓更多的開發者能夠了解到更廣泛的知識。另外,作者作為前端新兵,本文肯定有不當之處,歡迎批斗~~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86234.html
摘要:關鍵字在中的變化非常的靈活,如果用的不好就非常惡心,用的好程序就非常的優雅,靈活,飄逸所以掌握的用法,是每一個前端工程師必知必會的而且這個也是一些大公司筆試中常見的考察項第一種單獨的,指向的是這個對象注當前的執行環境是所以指向了第二種全局函 this關鍵字在javascript中的變化非常的靈活,如果用的不好就非常惡心,用的好,程序就非常的優雅,靈活,飄逸.所以掌握this的用法,是每...
摘要:數組中的元素自動前移,比慢的多。該方法接受一個返回值為布爾類型的函數,對數組中得每個元素使用該函數,如果對于所有的元素,該函數都返回則該方法返回。 數組的維基百科定義是: 在編程語言中,數組數據結構(英語:array data structure),簡稱數組(英語:Array),是一種數據結構,是數據元素(elements)的集合。元素可以通過索引來任意存取,索引通常是數字,用來計算元...
摘要:正確的解釋是允許在相等比較中進行強制類型轉換,而不允許。參考資料小議下字符串比較大小中的強制類型轉換核心概念類型轉換對象和方法隱式類型轉換小結 開胃菜 先說一個題外話,我在工作中遇到一個問題,需要比較 08:00 和 09:00 的大小,最后我找到三種方法: 在兩個字符串前后各拼接相同的年月日和秒,拼成完整的時間格式進行比較: var head = 2016-01-01 var fo...
閱讀 887·2023-04-25 19:17
閱讀 2184·2021-09-10 11:26
閱讀 1902·2019-08-30 15:54
閱讀 3416·2019-08-30 15:53
閱讀 2683·2019-08-30 11:20
閱讀 3397·2019-08-29 15:12
閱讀 1235·2019-08-29 13:16
閱讀 2390·2019-08-26 12:19