摘要:另一方面,在函數外部自然無法讀取函數內的局部變量。這段代碼中另一個值得注意的地方,就是這一行,首先在前面沒有使用關鍵字,因此是一個全局變量,而不是局部變量。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
一、JavaScript 數組方法對比 I. 新增:影響原數組小結放在前,金三銀四找工作高峰期,很榮幸的在這個時間段找到一家合適自己的公司,也希望還沒找到工作的朋友盡快找到合適自己的公司。下面分享一些這幾天看的一些知識點。
使用 array.push() 和 array.ushift() 新增元素會影響原來的數組。
兩種方式新增元素不會影響原數組,第一種是 array.concat() 。
第二種方法是使用 JavaScript 的展開(spread)操作符,展開操作符是三個點(…)
展開操作符會復制原來的數組,從原數組取出所有元素,然后存入新的環境。
III. 移除:影響原數組使用 array.pop() 和 array.shift() 移除數組元素時,會影響原來的數組。
array.pop() 和 array.shift() 返回被移除的元素,你可以通過一個變量獲取被移除的元素
array.splice() 也可以刪除數組的元素
像 array.pop() 和 array.shift() 一樣,array.splice() 同樣返回移除的元素
JavaScript 的 array.filter() 方法基于原數組創建一個新數組,新數組僅包含匹配特定條件的元素
以上代碼的條件是“不等于 ‘e’ ”,因此新數組(arr2)里面沒有包含 ‘e’。
箭頭函數的獨特性:
單行箭頭函數,’return’ 關鍵字是默認自帶的,不需要手動書寫。
可是,多行箭頭函數就需要明確地返回一個值。
另一種不影響原數組的方式是 array.slice()(不要與 array.splice() 混淆)。
如果知道替換哪一個元素,可以使用 array.splice()
VI. 替換:不影響原數組
可以使用 array.map() 創建一個新數組,并且可以檢查每一個元素,根據特定的條件替換它們。
使用 array.map() 轉換數據
array.map() 是個強力方法,可以用于轉換數據,而不污染原先的數據源
JS與PHP在函數傳參方面有點不同,PHP形參與實參個數要匹配,而JS就靈活多了,可以隨意傳參,實參比形參少或多都不會報錯。
實參比形參多不會報錯
function say(a){ alert(a); } say("will","WEB");
執行結果
我們再來看看形參比實參多的結果
function say(a,b){ alert("a 的值是 "+a+" b 的值是 "+b); } say("will");
執行結果
a 對應第一個實參“will”,b 沒有對應的實參所以值為undefined
其實有時候我們在程序設計比較復雜的時候并不指定參數個數,都是靈活運用。在函數里有一個數組arguments就是專門存儲實參數組的,通過arguments我們就可以知道實參個數以及值。
function arg(){ var str = "總共傳了"+arguments.length+"個參數 "; for(var i=0;i執行結果
在以上例子中,我們定義函數arg并沒有給它指定形參,而是使用arguments對象接收實參,非常靈活。
比如我們可以利用它來計算出一組數字里最小的數字,不管這組數字有多少個。如以下代碼:function arg(){ var tmp = 0, str = "在 "; for(var i=0;i執行 30,10,59,35 四個數對比結果
我們在加入兩個數,分別是 5 和 16
function arg(){ var tmp = 0, str = "在 "; for(var i=0;i執行 30,10,59,35,5,16 六個數對比結果
三、javascript閉包的理解 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。 1. 變量的作用域
根據兩次運算結果,我們發現無論我們傳進多少個數字,都能正確比對結果。arguments一般用在實參個數不定的地方,比如上邊的例子,你可以傳5個數進去比較,也可以傳100個數進去比較都可以。要理解閉包,首先必須理解Javascript特殊的變量作用域。
變量的作用域無非就是兩種:全局變量和局部變量。
Javascript語言的特殊之處,就在于函數內部可以直接讀取全局變量。var n=999; function f1(){ alert(n); } f1(); // 999
另一方面,在函數外部自然無法讀取函數內的局部變量。function f1(){ var n=999; } alert(n); // error這里有一個地方需要注意,函數內部聲明變量的時候,一定要使用var命令。如果不用的話,你實際上聲明了一個全局變量!
function f1(){ n=999; } f1(); alert(n); // 9992. 如何從外部讀取局部變量?出于種種原因,我們有時候需要得到函數內的局部變量。但是,前面已經說過了,正常情況下,這是辦不到的,只有通過變通方法才能實現。
那就是在函數的內部,再定義一個函數。function f1(){ var n=999; function f2(){ alert(n); // 999 } }在上面的代碼中,函數f2就被包括在函數f1內部,這時f1內部的所有局部變量,對f2都是可見的。但是反過來就不行,f2內部的局部變量,對f1就是不可見的。這就是Javascript語言特有的"鏈式作用域"結構(chain scope),子對象會一級一級地向上尋找所有父對象的變量。所以,父對象的所有變量,對子對象都是可見的,反之則不成立。
既然f2可以讀取f1中的局部變量,那么只要把f2作為返回值,我們不就可以在f1外部讀取它的內部變量了嗎!function f1(){ var n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 9993. 閉包的概念上一節代碼中的f2函數,就是閉包。
4. 閉包的用途
各種專業文獻上的"閉包"(closure)定義非常抽象,很難看懂。我的理解是,閉包就是能夠讀取其他函數內部變量的函數。
由于在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。
所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。
怎么來理解這句話呢?請看下面的代碼。function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000在這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,第二次的值是1000。這證明了,函數f1中的局部變量n一直保存在內存中,并沒有在f1調用后被自動清除。
5. 使用閉包的注意點
為什么會這樣呢?原因就在于f1是f2的父函數,而f2被賦給了一個全局變量,這導致f2始終在內存中,而f2的存在依賴于f1,因此f1也始終在內存中,不會在調用結束后,被垃圾回收機制(garbage collection)回收。
這段代碼中另一個值得注意的地方,就是"nAdd=function(){n+=1}"這一行,首先在nAdd前面沒有使用var關鍵字,因此nAdd是一個全局變量,而不是局部變量。其次,nAdd的值是一個匿名函數(anonymous function),而這個匿名函數本身也是一個閉包,所以nAdd相當于是一個setter,可以在函數外部對函數內部的局部變量進行操作。1)由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
6. 思考題
2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。如果你能理解下面兩段代碼的運行結果,應該就算理解閉包的運行機制了。
代碼片段一。var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()());代碼片段二。
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()());原文連接:
http://note.youdao.com/notesh...
http://note.youdao.com/notesh...
http://note.youdao.com/notesh...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82024.html
摘要:一基礎接口的意義百度規范擴展回調抽象類的意義我的前端面試經歷百度前端掘金博主就讀于電子科技大學,大三狗一枚面試是個漫長的過程,從海投到收獲電話面試,一面二面三面,一個步驟出錯那么后面就宣告終結。 一道常被人輕視的前端 JS 面試題 - 前端 - 掘金 目錄前言第一問第二問變量聲明提升函數表達式第三問第四問第五問第六問構造函數的返回值第七問最后前言 年前剛剛離職了,分享下我曾經出過的一道...
摘要:獲取的對象范圍方法獲取的是最終應用在元素上的所有屬性對象即使沒有代碼,也會把默認的祖宗八代都顯示出來而只能獲取元素屬性中的樣式。因此對于一個光禿禿的元素,方法返回對象中屬性值如果有就是據我測試不同環境結果可能有差異而就是。 花了很長時間整理的前端面試資源,喜歡請大家不要吝嗇star~ 別只收藏,點個贊,點個star再走哈~ 持續更新中……,可以關注下github 項目地址 https:...
摘要:前言在大廠工作了年,當了年的前端面試官,把大廠常問的面試題與答案匯總在我的中。第題如何劫持的請求,提供思路難度阿里騰訊很多人在上搜索前端面試詳解,把答案倒背如流,但是問到如何劫持請求的時候就一臉懵逼,是因為還是停留在理論性階段。前言 在大廠工作了6年,當了3年的前端面試官,把大廠常問的面試題與答案匯總在我的Github中。希望對大家有所幫助,助力大家進入自己理想的企業。 項目地址是:git...
摘要:前言在大廠工作了年,當了年的前端面試官,把大廠常問的面試題與答案匯總在我的中。第題如何劫持的請求,提供思路難度阿里騰訊很多人在上搜索前端面試詳解,把答案倒背如流,但是問到如何劫持請求的時候就一臉懵逼,是因為還是停留在理論性階段。 前言 在大廠工作了6年,當了3年的前端面試官,把大廠常問的面試題與答案匯總在我的Github中。希望對大家有所幫助,助力大家進入自己理想的企業。 項目地址是:...
摘要:前言在大廠工作了年,當了年的前端面試官,把大廠常問的面試題與答案匯總在我的中。第題如何劫持的請求,提供思路難度阿里騰訊很多人在上搜索前端面試詳解,把答案倒背如流,但是問到如何劫持請求的時候就一臉懵逼,是因為還是停留在理論性階段。 前言 在大廠工作了6年,當了3年的前端面試官,把大廠常問的面試題與答案匯總在我的Github中。希望對大家有所幫助,助力大家進入自己理想的企業。 項目地址是:...
閱讀 3027·2021-11-02 14:40
閱讀 844·2019-08-30 15:53
閱讀 1265·2019-08-30 15:53
閱讀 3259·2019-08-30 13:53
閱讀 3305·2019-08-29 12:50
閱讀 1132·2019-08-26 13:49
閱讀 1863·2019-08-26 12:20
閱讀 3660·2019-08-26 11:33