摘要:例如,考慮比較由字符串構(gòu)造函數(shù)創(chuàng)建的字符串對象和字符串字面量這里的操作符正在檢查這兩個對象的值并返回,但是鑒于它們不是相同類型并且返回。我的建議是完全繞過這個問題,只是不使用字符串構(gòu)造函數(shù)創(chuàng)建字符串對象。
Q1:javascript的閉包是如何工作的?
正如愛因斯坦所說的:
如果你不能把它解釋給一個六歲的小孩,說明你對它還不夠了解。
我曾嘗試向一個27歲的朋友解釋js閉包并且完全失敗了。你會如何向一個有概念(例如,函數(shù),變量等)的人解釋,來彌補閉包知識,但不理解閉包本身?
Answers:無論何時你看到function關(guān)鍵字在另一個函數(shù)內(nèi)部,那么內(nèi)部函數(shù)將可訪問外部函數(shù)的變量。
function foo(x) { var tmp = 3; function bar(y) { alert(x + y + (++tmp)); // will alert 16 } bar(10); } foo(2);
這將總是彈出16,因為函數(shù)bar 可以訪問變量 x ,它是作為foo參數(shù)定義的,也可以訪問變量tmp。
這就是一個閉包。函數(shù)沒有任何返回的時候就被稱為閉包。簡單地訪問即時詞法作用域(immediate lexical scope)外的變量創(chuàng)建了一個閉包。
function foo(x) { var tmp = 3; return function (y) { alert(x + y + (++tmp)); // will also alert 16 } } var bar = foo(2); // bar is now a closure. bar(10);
上面的函數(shù)也會彈出16,因為 bar 仍然可以指向 x 和 tmp,即使它不再直接范圍內(nèi)。
然而,因為 tmp 仍然在bar的閉包內(nèi)部閑逛,它也正在增加。每次你調(diào)用bar的時候它會被增加。
最簡單的閉包的例子是這個:
var a = 10; var b = 6; function test() { console.log(a); // will output 10 console.log(b); // will output 6 } test();
當一個js函數(shù)被調(diào)用的時候,一個新的執(zhí)行上下文環(huán)境就被創(chuàng)建了。函數(shù)參數(shù)和父對象一起,這個執(zhí)行上下文也接收所有的外部聲明的變量(在上面的例子,"a" 和 "b" 都是)
創(chuàng)建多個閉包函數(shù)是可能的,或者通過返回他們的列表,或者通過設(shè)置他們的全局變量。所有這些將指向同上面的x和tmp,他們不會拷貝他們本身。
這里的數(shù)字 x 是字面量的數(shù)字。和js其他字面量一樣,當foo被調(diào)用,數(shù)字 x 就被復(fù)制到 foo 內(nèi)作為它的 參數(shù) x
另一方面,當處理對象的時候,js總會使用引用。如果說,你用一個Object來調(diào)用foo,閉包將會返回最早引用的Object
function foo(x) { var tmp = 3; return function (y) { alert(x + y + tmp); x.memb = x.memb ? x.memb + 1 : 1; alert(x.memb); } } var age = 2; var bar = foo(age); // bar is now a closure referencing age. bar(10);
果然,每次調(diào)用bar(10)都將增加x.memb。這也許不是所預(yù)期的,x僅僅是指向同樣的對象 作為age變量!經(jīng)過幾次調(diào)用bar之后,age.memb將是2!這是與HTML對象引用的內(nèi)存泄漏的基礎(chǔ)
Q2:我如何使用jQuery做一個重定向頁面?原文鏈接:http://stackoverflow.com/ques...
jQuery是沒有必要的,并且window.location.replace(...)將最佳模擬HTTP重定向。
這比使用window.location.href =要好,因為replace()并不把起始頁放入會話歷史(session history)里,這意味著用戶不會陷入永無休止的后退按鈕的窘境。如果你想要模擬人點擊一個鏈接,請使用location.href。如果要模擬一個HTTP重定向,使用location.replace。
例如:
// 類似HTTP重定向的行為 window.location.replace("http://stackoverflow.com"); // 類似點擊一個鏈接的行為 window.location.;
Q3:測試是否有東西被隱藏 問題描述:原文鏈接:http://stackoverflow.com/ques...
在jQuery中,可以切換元素的可見性,使用方法.hide(), .show() 或者.toggle(). 使用jQuery,你如何測試一個元素是可見的還是隱藏的?Best Answers:
因為這個問題是指一種單一的元素,所以該代碼可能更適合:
// 檢查display:[none|block], 忽略 visible:[true|false] $(element).is(":visible");Other Answers:
你可以使用hidden選擇器:
// 匹配的是隱藏的所有元素 $("element:hidden")
和visible選擇器:
// 匹配所有可見的元素 $("element:visible")
Q4:"use strict"在js中的作用是什么,其背后的思考是什么? 問題描述:問題鏈接:http://stackoverflow.com/ques...
最近,我運行我的一些JavaScript代碼通過Crockford的JSLint的,它給了以下錯誤:
Problem at line 1 character 1: Missing "use strict" statement.
做了一些搜索,我意識到是有些人添加了“use strict”到他們的JavaScript代碼中。有一次,我添加了該聲明,錯誤就停止出現(xiàn)了。不幸的是,谷歌并沒有透露太多這字符串聲明的歷史的背后。當然,它一定和javascript如何被瀏覽器解析有關(guān)系,但我不知道效果會怎樣。
那么,什么是"use strict";所有和它仍然相關(guān)聯(lián)的涵義是什么?
當前任何瀏覽器是否對"use strict"做出反應(yīng);該字符串或是在將來做使用?
Best Answers:這篇文章也許對你有幫助:
John Resig - ECMAScript 5 Strict Mode, JSON, and More
引用一些有趣的部分:
嚴格模式是`ECMAScript 5`中的一項新特征,允許你把一段程序或功能放置在"strict"工作環(huán)境中。這種嚴格上下文環(huán)境防止某些行為被采取并引發(fā)更多的異常。
并且:
嚴格的模式有助于幾個方面: 它捕獲了一些常見的編碼錯誤,拋出異常。 它阻止,或拋出錯誤,當相對“不安全”的行為被采用(例如獲取全局對象)。 它禁用那些混淆的或者考慮不周的特征
另外請注意,你可以在整個文件中申請嚴格模式...或者你可以僅在特定的函數(shù)中使用它(仍然是引用John Resig 的文章):
// 非嚴格的代碼... (function(){ "use strict"; // 嚴格定義你的庫... })(); // 非嚴格的代碼
如果你有混合使用新舊代碼,它可能會有所幫助;-)
所以,我認為這是一個有點像"use strict",你可以在Perl(因此得名?)中使用:它通過檢測更多可能導(dǎo)致破壞的事情來幫助你少犯錯誤。
Q5:如何檢測一個字符串包含另一個子字符串? 問題描述:原文鏈接:http://stackoverflow.com/ques...
在javascript中,我如何檢測一個字符串包含另一個子字符串。通常我會想到String.contains()方法,但似乎沒有一個。
Best Answers:indexOf返回一個字符串在其他字符串中的位置。如果沒找到,它會返回-1
var s = "foo"; alert(s.indexOf("oo") > -1);
Q6:我如何在JavaScript中獲得查詢字符串的值? 問題描述:原文地址:http://stackoverflow.com/ques...
是否有一個通過jQuery無插件查詢字符串值的方式(或者沒有)。
如果是,怎么做?如果不是,是否有一款可以這么做的插件?
你不需要通過jQuery就可以達到那個目的。你可以僅僅使用純javascript:
function getParameterByName(name) { name = name.replace(/[[]/, "[").replace(/[]]/, "]"); var regex = new RegExp("[?&]" + name + "=([^]*)"), results = regex.exec(location.search); return results === null ? "" : decodeURIComponent(results[1].replace(/+/g, " ")); }
用法:
var prodId = getParameterByName("prodId");
Q7:var functionName = function() {} vs function functionName() {} 問題描述:問題鏈接:http://stackoverflow.com/ques...
我最近開始維護別人的JavaScript代碼。我修復(fù)bug,增加功能,也試圖整理代碼并使其更加一致。
之前的開發(fā)人員使用兩種函數(shù)聲明方式,我無法弄清是否這背后有或沒有解決的原因。
兩種方法是:
var functionOne = function() { // Some code }; function functionTwo() { // Some code }
使用這兩種不同方法的原因是什么,以及各自的利弊是什么?
Best Answers:所不同的是functionOne被定義在運行時,而functionTwo被限定在分析時的腳本塊。例如:
這也意味著在嚴格的模式下,你不能有條件地使用第二語法定義函數(shù):
如果沒有"use strict"這將不會導(dǎo)致一個錯誤 并且 functionThree 將被定義無關(guān)test的值。
Q8:JavaScript 中應(yīng)該用 "==" 還是 "==="? 問題描述:原文鏈接:http://stackoverflow.com/ques...
我用JSLint來檢查javascript,當我在做類似比較idSele_UNVEHtype.value.length == 0的時候,接著它返回許多建議用===(三個等號)來替換==(兩個等號)
用 ===來取代==是否有性能優(yōu)勢?
當有許多比較操作符存在的時候,任何性能的改進都將很受歡迎。
如果沒有類型轉(zhuǎn)換發(fā)生,性能會超過== ?
Best Answers:恒等式(===)操作符
參考文獻:JavaScript教程:比較運算符
==操作符在做任意按需類型轉(zhuǎn)換后將比較相等性,而===操作符并不會, ===運算符將不做轉(zhuǎn)換,所以如果兩值不一樣類型===將返回false。這種情況下,===將更快,并可能比==返回不同的結(jié)果。在所有其他情況下的性能都是一樣的。
引用 Douglas Crockford 的JavaScript: The Good Parts
javascript擁有兩套等性運算符: `===`和`!==`,和他們邪惡的雙胞胎 `==`和`!=`。好的那一個會按你所期望的方式工作。如果兩個操作數(shù)是相同的類型,具有相同的值,那么`===`產(chǎn)生`true`,`!==`產(chǎn)生`false`。當操作數(shù)具有相同類型時,邪惡雙胞胎做正確的事,但是如果他們是不同類型,它們試圖強制值。他們這么做的規(guī)格是復(fù)雜難記的,這里有一些有趣的例子: "" == "0" // false 0 == "" // true 0 == "0" // true false == "false" // false false == "0" // true false == undefined // false false == null // false null == undefined // true " " == 0 // true
我的建議是不要使用邪惡的雙胞胎。相反,總是用===和!==。所有的比較只是產(chǎn)生虛假的= = =運算符。用===操作符的所有的比較僅顯示false
更新:
var a = [1,2,3]; var b = [1,2,3]; var c = { x: 1, y: 2 }; var d = { x: 1, y: 2 }; var e = "text"; var f = "te" + "xt"; a == b // false a === b // false c == d // false c === d // false e == f // true e === f // true
特殊情況下,當你比較字面量和對象的時候,考慮到它的toString或者valueOf方法。例如,考慮比較由字符串構(gòu)造函數(shù)創(chuàng)建的字符串對象和字符串字面量
"abc" == new String("abc") // true "abc" === new String("abc") // false
這里的== 操作符正在檢查這兩個對象的值并返回true,但是鑒于它們不是相同類型并且===返回false。哪一個是正確的?這實際上取決于你想要比較什么。我的建議是完全繞過這個問題,只是不使用字符串構(gòu)造函數(shù)創(chuàng)建字符串對象。
參考: http://www.ecma-international...
原文鏈接:http://stackoverflow.com/ques...
Q9:克隆一個對象的最有效的方法是什么? 問題描述克隆一個js對象的最有效的方法是什么?我已經(jīng)見過obj = eval(uneval(o));被使用,但是目前僅有Firefox支持。在 Mootools 1.2,我已經(jīng)做了類似obj = JSON.decode(JSON.encode(o));的事情,但是存在效率問題
我也見過遞歸復(fù)制功能的各種缺陷。我很驚訝,沒有規(guī)范的解決方案存在。
Best Answers:注:這是另一個答復(fù),沒有對這個問題作出恰當?shù)幕貞?yīng)。如果你希望快速復(fù)制一個對象請參考:[Corban"s advice in his
answer][4] 他對這個問題的回答。
我想指出,jQuery中的.clone()方法只克隆DOM元素。為了克隆JavaScript對象,你需要這么做:
// 淺拷貝 var newObject = jQuery.extend({}, oldObject); // 深拷貝 var newObject = jQuery.extend(true, {}, oldObject);
更多信息請參考:http://api.jquery.com/jQuery....
我還想指出,深拷貝其實比上面所示聰明得多 - 它是能夠避免很多陷阱(例如,想深擴展DOM元素)。它被頻繁地用于jQuery的核心并且在插件里也有重大的作用
Other answers:似乎沒有一個內(nèi)置的方法,你可以嘗試:
function clone(obj) { if(obj == null || typeof(obj) != "object") return obj; var temp = obj.constructor(); // changed for(var key in obj) { if(obj.hasOwnProperty(key)) { temp[key] = clone(obj[key]); } } return temp; }
Q10:如何從一個JavaScript對象中刪除一個屬性 問題描述:原文鏈接:http://stackoverflow.com/ques...
我是這么創(chuàng)建一個對象的:
var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
以new myJSONObject結(jié)束的移除屬性regex的最好方法是什么?
var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI"};Best Answers:
delete myJSONObject.regex; // or, delete myJSONObject["regex"]; // or, var prop = "regex"; delete myJSONObject[prop];
參考:understanding delete
Other Answers:var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; delete myJSONObject.regex; alert ( myJSONObject.regex); // alerts: undefined
這種方法在火狐和IE下起作用,我個人認為在其他瀏覽器也起作用
問題鏈接:http://stackoverflow.com/ques...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85570.html
摘要:文件系統(tǒng)請求和相關(guān)請求都會放進這個線程池處理其他的請求,如網(wǎng)絡(luò)平臺特性相關(guān)的請求會分發(fā)給相應(yīng)的系統(tǒng)處理單元參見設(shè)計概覽。 譯者按:在 Medium 上看到這篇文章,行文脈絡(luò)清晰,闡述簡明利落,果斷點下翻譯按鈕。第一小節(jié)背景鋪陳略啰嗦,可以略過。剛開始我給這部分留了個 blah blah blah 直接翻后面的,翻完之后回頭看,考慮完整性才把第一節(jié)給補上。接下來的內(nèi)容干貨滿滿,相信對 N...
摘要:可是雖然搜出來的比好,但是也還是不能確保質(zhì)量都是沒問題的。下面我想整理一些不錯的資源,方便自己的學(xué)習和討論。實踐是檢驗真理的唯一標準上有足夠多的高質(zhì)量的開源項目。這里是我整理的關(guān)于使用的方便快速查看的筆記。 歡迎大家也來推薦好的資源!!!! 為什么整理這篇文章 想通過在網(wǎng)絡(luò)上隨便搜索出來的文章學(xué)習其實是很不明智的,往往不能保證知識的質(zhì)量、全面性和系統(tǒng)性。甚至是粗制濫造、造假的所謂知識!...
摘要:引用一個的提問個人覺得總結(jié)的比較好的兩句話原文地址另外,附上中對閉包的講解閉包中文對于閉包的簡要概括原文原文地址匿名函數(shù)和閉包來自文章作者版權(quán)聲明自由轉(zhuǎn)載非商用非衍生保持署名創(chuàng)意共享許可證轉(zhuǎn)載請注明出處 引用一個stackoverflow的提問 個人覺得總結(jié)的比較好的兩句話: An anonymous function is just a function that has no na...
閱讀 2464·2021-11-23 09:51
閱讀 523·2019-08-30 13:59
閱讀 1829·2019-08-29 11:20
閱讀 2534·2019-08-26 13:41
閱讀 3244·2019-08-26 12:16
閱讀 732·2019-08-26 10:59
閱讀 3326·2019-08-26 10:14
閱讀 603·2019-08-23 17:21