StackOverflow 上關於 JS 的熱門問答

發表於2016-09-26

Q1:javascript的閉包是如何工作的?

正如愛因斯坦所說的:

如果你不能把它解釋給一個六歲的小孩,說明你對它還不夠了解。

我曾嘗試向一個27歲的朋友解釋js閉包並且完全失敗了。你會如何向一個有概念(例如,函式,變數等)的人解釋,來彌補閉包知識,但不理解閉包本身?

Answers:

無論何時你看到function關鍵字在另一個函式內部,那麼內部函式將可訪問外部函式的變數。

這將總是彈出16,因為函式bar 可以訪問變數 x ,它是作為foo引數定義的,也可以訪問變數tmp

這就是一個閉包。函式沒有任何返回的時候就被稱為閉包。簡單地訪問即時詞法作用域(immediate lexical scope)外的變數建立了一個閉包。

上面的函式也會彈出16,因為 bar 仍然可以指向 xtmp,即使它不再直接範圍內。

然而,因為 tmp 仍然在bar的閉包內部閒逛,它也正在增加。每次你呼叫bar的時候它會被增加。
最簡單的閉包的例子是這個:

當一個js函式被呼叫的時候,一個新的執行上下文環境就被建立了。函式引數和父物件一起,這個執行上下文也接收所有的外部宣告的變數(在上面的例子,'a''b' 都是)

建立多個閉包函式是可能的,或者通過返回他們的列表,或者通過設定他們的全域性變數。所有這些將指向同上面的xtmp,他們不會拷貝他們本身。

這裡的數字 x 是字面量的數字。和js其他字面量一樣,當foo被呼叫,數字 x 就被複制到 foo 內作為它的 引數 x

另一方面,當處理物件的時候,js總會使用引用。如果說,你用一個Object來呼叫foo,閉包將會返回最早引用的Object

果然,每次呼叫bar(10)都將增加x.memb。這也許不是所預期的,x僅僅是指向同樣的物件 作為age變數!經過幾次呼叫bar之後,age.memb將是2!這是與HTML物件引用的記憶體洩漏的基礎

原文連結:http://stackoverflow.com/questions/111102/how-do-javascript-closures-work

Q2:我如何使用jQuery做一個重定向頁面?

jQuery是沒有必要的,並且window.location.replace(...)將最佳模擬HTTP重定向。
這比使用window.location.href =要好,因為replace()並不把起始頁放入會話歷史(session history)裡,這意味著使用者不會陷入永無休止的後退按鈕的窘境。如果你想要模擬人點選一個連結,請使用location.href。如果要模擬一個HTTP重定向,使用location.replace

例如:

原文連結:http://stackoverflow.com/questions/503093/how-can-i-make-a-redirect-page-using-jquery

Q3:測試是否有東西被隱藏

問題描述:

Best Answers:

因為這個問題是指一種單一的元素,所以該程式碼可能更適合:

Other Answers:

你可以使用hidden選擇器:

visible選擇器:

問題連結:http://stackoverflow.com/questions/178325/testing-if-something-is-hidden

Q4:”use strict”在js中的作用是什麼,其背後的思考是什麼?

問題描述:

最近,我執行我的一些JavaScript程式碼通過CrockfordJSLint的,它給了以下錯誤:

做了一些搜尋,我意識到是有些人新增了“use strict”到他們的JavaScript程式碼中。有一次,我新增了該宣告,錯誤就停止出現了。不幸的是,谷歌並沒有透露太多這字串宣告的歷史的背後。當然,它一定和javascript如何被瀏覽器解析有關係,但我不知道效果會怎樣。

那麼,什麼是"use strict";所有和它仍然相關聯的涵義是什麼?

當前任何瀏覽器是否對"use strict"做出反應;該字串或是在將來做使用?

Best Answers:

這篇文章也許對你有幫助:

John Resig – ECMAScript 5 Strict Mode, JSON, and More

引用一些有趣的部分:

並且:

另外請注意,你可以在整個檔案中申請嚴格模式…或者你可以僅在特定的函式中使用它(仍然是引用John Resig 的文章):

如果你有混合使用新舊程式碼,它可能會有所幫助;-)

所以,我認為這是一個有點像"use strict",你可以在Perl(因此得名?)中使用:它通過檢測更多可能導致破壞的事情來幫助你少犯錯誤。

原文連結:http://stackoverflow.com/questions/1335851/what-does-use-strict-do-in-javascript-and-what-is-the-reasoning-behind-it

Q5:如何檢測一個字串包含另一個子字串?

問題描述:

javascript中,我如何檢測一個字串包含另一個子字串。通常我會想到String.contains()方法,但似乎沒有一個。

Best Answers:

indexOf返回一個字串在其他字串中的位置。如果沒找到,它會返回-1

原文地址:http://stackoverflow.com/questions/1789945/how-can-i-check-if-one-string-contains-another-substring

Q6:我如何在JavaScript中獲得查詢字串的值?

問題描述:

是否有一個通過jQuery無外掛查詢字串值的方式(或者沒有)。
如果是,怎麼做?如果不是,是否有一款可以這麼做的外掛?

Best Answers:

你不需要通過jQuery就可以達到那個目的。你可以僅僅使用純javascript

用法:

問題連結:http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript

Q7:var functionName = function() {} vs function functionName() {}

問題描述:

我最近開始維護別人的JavaScript程式碼。我修復bug,增加功能,也試圖整理程式碼並使其更加一致。

之前的開發人員使用兩種函式宣告方式,我無法弄清是否這背後有或沒有解決的原因。

兩種方法是:

使用這兩種不同方法的原因是什麼,以及各自的利弊是什麼?

Best Answers:

所不同的是functionOne被定義在執行時,而functionTwo被限定在分析時的指令碼塊。例如:

這也意味著在嚴格的模式下,你不能有條件地使用第二語法定義函式:

如果沒有"use strict"這將不會導致一個錯誤 並且 functionThree 將被定義無關test的值。

原文連結:http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname

Q8:JavaScript 中應該用 “==” 還是 “===”?

問題描述:

我用JSLint來檢查javascript,當我在做類似比較idSele_UNVEHtype.value.length == 0的時候,接著它返回許多建議用===(三個等號)來替換==(兩個等號)

===來取代==是否有效能優勢?

當有許多比較操作符存在的時候,任何效能的改進都將很受歡迎。

如果沒有型別轉換髮生,效能會超過==

Best Answers:

恆等式(===)操作符

參考文獻:JavaScript教程:比較運算子

==操作符在做任意按需型別轉換後將比較相等性,而===操作符並不會, ===運算子將不做轉換,所以如果兩值不一樣型別===將返回false。這種情況下,===將更快,並可能比==返回不同的結果。在所有其他情況下的效能都是一樣的。

引用 Douglas CrockfordJavaScript: The Good Parts

我的建議是不要使用邪惡的雙胞胎。相反,總是用===!==。所有的比較只是產生虛假的= = =運算子。用===操作符的所有的比較僅顯示false

更新:

特殊情況下,當你比較字面量和物件的時候,考慮到它的toString或者valueOf方法。例如,考慮比較由字串建構函式建立的字串物件和字串字面量

這裡的== 操作符正在檢查這兩個物件的值並返回true,但是鑑於它們不是相同型別並且===返回false。哪一個是正確的?這實際上取決於你想要比較什麼。我的建議是完全繞過這個問題,只是不使用字串建構函式建立字串物件。

參考: http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

原文連結:http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons

Q9:克隆一個物件的最有效的方法是什麼?

問題描述

克隆一個js物件的最有效的方法是什麼?我已經見過obj = eval(uneval(o));被使用,但是目前僅有Firefox支援。在 Mootools 1.2,我已經做了類似obj = JSON.decode(JSON.encode(o));的事情,但是存在效率問題

我也見過遞迴複製功能的各種缺陷。我很驚訝,沒有規範的解決方案存在。

Best Answers:

注:這是另一個答覆,沒有對這個問題作出恰當的回應。如果你希望快速複製一個物件請參考:[Corban’s advice in hisanswer][4] 他對這個問題的回答。

我想指出,jQuery中的.clone()方法只克隆DOM元素。為了克隆JavaScript物件,你需要這麼做:

更多資訊請參考:http://api.jquery.com/jQuery.extend/

我還想指出,深拷貝其實比上面所示聰明得多 – 它是能夠避免很多陷阱(例如,想深擴充套件DOM元素)。它被頻繁地用於jQuery的核心並且在外掛裡也有重大的作用

Other answers:

似乎沒有一個內建的方法,你可以嘗試:

原文連結:http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-an-object/122704#122704

Q10:如何從一個JavaScript物件中刪除一個屬性

問題描述:

我是這麼建立一個物件的:

new myJSONObject結束的移除屬性regex的最好方法是什麼?

Best Answers:

參考:understanding delete

Other Answers:

這種方法在火狐和IE下起作用,我個人認為在其他瀏覽器也起作用

相關文章