真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javascript捷徑,捷徑運(yùn)行javascript

js如何學(xué)習(xí)? 如何快速入門

j入門還是比較容易的,想要深入的話就需要一點(diǎn)時(shí)間,

專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)麻城免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

系統(tǒng)的方法還是根據(jù)w3c的入門步驟去學(xué),邊學(xué)邊做,

要經(jīng)常寫才行,當(dāng)然沒(méi)有人指導(dǎo)的話會(huì)走不少?gòu)澛贰?/p>

你可以找一些視頻教程來(lái)跟著學(xué)習(xí),

也可以向身邊的前端工程師朋友請(qǐng)教。

這個(gè)是我的博客網(wǎng)頁(yè)鏈接里面有入門教程,

是經(jīng)過(guò)我的系統(tǒng)分類了的,當(dāng)然如果你一點(diǎn)基礎(chǔ)都沒(méi)有的話

還是去w3c網(wǎng)站上看教程

看了下用javascript寫的游戲程序 為什么這么難 有捷徑?jīng)] ?? 感覺(jué)javascript比C語(yǔ)言和C++ 都難了

js畢竟是腳本語(yǔ)言, 不像c++,java這些面向?qū)ο蟮某绦蛘Z(yǔ)言, 開(kāi)發(fā)程序不同, 書寫和設(shè)計(jì)也不一樣.

捕捉鼠標(biāo)啊,簡(jiǎn)單的效果處理啊,一般的判斷啊等等,還可以. 以前寫過(guò)一個(gè)速算24, 現(xiàn)在自己看代碼都感覺(jué)亂. 但感覺(jué)難倒是不難...只是很多東西實(shí)現(xiàn)起來(lái)比較麻煩,不像c++,java有很多現(xiàn)成的包,類,框架.

如何快速的學(xué)習(xí)基本JS技術(shù)?

實(shí)話說(shuō)學(xué)習(xí)是沒(méi)有捷徑的,最多也就是有一些學(xué)習(xí)的方法和技巧。關(guān)于學(xué)習(xí)JavaScript也就是js我分享一下我這個(gè)菜鳥(niǎo)的學(xué)習(xí)方法,只是個(gè)人的一些看法,不喜勿噴。

1、基礎(chǔ)要學(xué)的好

學(xué)過(guò)js的都是知道的,js的一些基礎(chǔ)的語(yǔ)法和一些變成語(yǔ)言是不一樣的,所以需要額外的注意一些基礎(chǔ)的語(yǔ)法,舉例來(lái)說(shuō):作用域,一般的編程語(yǔ)言都是全局變量函數(shù)外有效,函數(shù)內(nèi)的變量函數(shù)內(nèi)有效,而js是不一樣的,js的全局變量函數(shù)外和函數(shù)內(nèi)都有效,函數(shù)內(nèi)的函數(shù)只函數(shù)內(nèi)有效。還有js是基于對(duì)象的語(yǔ)言,但是為了支持面向?qū)ο蟮木幊趟枷?,js使用函數(shù)來(lái)模擬類或者是對(duì)象的概念,這些都是比較難理解的,含有一些js的地層?xùn)|西如原型鏈、上下文等也是非常的不好理解,這就需要基礎(chǔ)的知識(shí)一定要扎實(shí)才能行。

2、多練習(xí)和實(shí)踐

其實(shí)學(xué)習(xí)編程都是這樣的,多動(dòng)手多思考是學(xué)習(xí)編程語(yǔ)言的最好辦法,很多東西看起來(lái)簡(jiǎn)單但是做起來(lái)就非常難了,解決的方法是學(xué)習(xí)js要和做網(wǎng)頁(yè)特效聯(lián)系起來(lái),畢竟js的一個(gè)很大的應(yīng)用方向就是實(shí)現(xiàn)網(wǎng)頁(yè)的效果和一些交互,所以學(xué)習(xí)基礎(chǔ)的同時(shí)要試著使用原生的js代碼來(lái)實(shí)現(xiàn)一些網(wǎng)頁(yè)特效,從中可以學(xué)到j(luò)s這門語(yǔ)言的博大精深。

2、學(xué)習(xí)面向?qū)ο蟮木幊趟枷?/p>

雖然js對(duì)于面向?qū)ο缶幊痰闹С植皇呛芡昝?,但是一些js的大神使用了一些很多的方法,如構(gòu)造函數(shù)等模擬了一些比較完整的面向?qū)ο缶幊?,所以難點(diǎn)也出來(lái)了,那就是js的面向?qū)ο笠绕渌恼Z(yǔ)言復(fù)雜難理解。

4、學(xué)習(xí)js的一些框架

使用原生的js進(jìn)行開(kāi)發(fā)太難了,但是我們可以通過(guò)js的框架來(lái)解決這個(gè)問(wèn)題,基礎(chǔ)的框架如jQuery,還有比較高級(jí)的框架如angularjs都是很不錯(cuò)的東西,只是js原生學(xué)的好,這些框架也就比較好理解了

蘋果捷徑app找不到

具體原因?yàn)樵贏pp Store中搜索“捷徑”,并沒(méi)有Workflow,需要搜索英文名字才能找到。

更新內(nèi)容介紹:

將捷徑添加到Siri即可通過(guò)語(yǔ)音運(yùn)行

支持Siri捷徑的應(yīng)用現(xiàn)提供多個(gè)新操作

Siri現(xiàn)可在鎖定屏幕上和“搜索”中建議您日常使用的捷徑

Siri會(huì)基于您的日常事務(wù)和最近的應(yīng)用使用情況來(lái)建議可添加到“捷徑”中的操作

通過(guò)“設(shè)定無(wú)線局域網(wǎng)”、“設(shè)定低電量模式”和“設(shè)定勿擾模式”等新操作來(lái)更改系統(tǒng)設(shè)置

通過(guò)新的支付操作即可使用Apple Pay和您喜愛(ài)的應(yīng)用來(lái)付款和請(qǐng)款

通過(guò)新的“在網(wǎng)頁(yè)上運(yùn)行JavaScript”操作來(lái)在Safari瀏覽器中運(yùn)行自定腳本

“捷徑”取代了Workflow應(yīng)用,所有現(xiàn)有工作流程都會(huì)自動(dòng)導(dǎo)入!

擴(kuò)展資料:

延長(zhǎng)iPhone手機(jī)電池壽命的小技巧:

1.養(yǎng)成充電好習(xí)慣

在蘋果手機(jī)提示低電量的時(shí)候及時(shí)充電,避免電量過(guò)低引起自動(dòng)關(guān)機(jī),如果電池效率低于80%盡量將電池更換。

2.升級(jí)到最新版iOS13

蘋果在推出的iOS 13中新增了一項(xiàng)名為“優(yōu)化電池充電”的功能,該功能可以智能的學(xué)習(xí)和判斷用戶的使用及充電習(xí)慣,使充電過(guò)程更加平衡,從而減緩電池的老化,并在一定程度上提升iPhone的續(xù)航能力。

查看方法:“優(yōu)化電池充電”功能可在設(shè)置-電池-電池健康中查看~

3.禁止后臺(tái)應(yīng)用程序刷新

自iOS 7開(kāi)始,應(yīng)用程序可以并且確實(shí)在后臺(tái)運(yùn)行時(shí)使用電池壽命。你可以看到應(yīng)用程序在后臺(tái)運(yùn)行了多少時(shí)間。如果某個(gè)應(yīng)用程序在不使用它時(shí)耗盡了太多電量,則可以禁用后臺(tái)應(yīng)用程序刷新以防止它在后臺(tái)運(yùn)行。如果應(yīng)用程序過(guò)度耗電的話,我們也可以選擇將其卸載!

4.啟用低電量模式

iOS 9新添“低電量模式”(Low Power Mode)功能,可讓手機(jī)更省電。啟用低電量模式后,你的屏幕略微變暗,限制后臺(tái)進(jìn)程,使處理器略微變慢,或者在正常使用時(shí)降低設(shè)備所需的能量。

操作方法:?jiǎn)⒂么斯δ茏詈?jiǎn)單方法是從iPhone的右上角向下滑動(dòng),然后電池圖標(biāo)即可?;蛘吣憧梢栽谠O(shè)置電池低功率模式中啟用低功率模式。

5.關(guān)閉某些APP推送

要知道,一些推送通知、應(yīng)用程序通知、電子郵件讀取的通知等等,所有這些都會(huì)縮短電池壽命,因此要想讓iPhone手機(jī)電池壽命更長(zhǎng),最好將其關(guān)閉??梢栽凇霸O(shè)置”,對(duì)每個(gè)應(yīng)用程序進(jìn)行編輯,關(guān)閉通知。

JavaScript高級(jí)程序設(shè)計(jì) 該怎么看

不要著急,靜下心來(lái)慢慢看。

先講一下自己吧。 大一,學(xué)校不讓帶電腦。偶然的機(jī)會(huì)下對(duì)前端產(chǎn)生了興趣,大神學(xué)長(zhǎng)們都推薦看這本書,然后就在沒(méi)有代碼實(shí)踐的情況下研究這本書。之前有pascal與c的基礎(chǔ),匆匆翻了一遍之后出現(xiàn)第一個(gè)問(wèn)題:

對(duì)面向?qū)ο笥懈拍?,但根本不熟悉,思維還是停留在面向過(guò)程中,最嚴(yán)重的是自己覺(jué)得懂了。

然后在頗有自信的情況下去讀了第二遍,主要研究原型和編程模式的東西,出現(xiàn)了第二個(gè)問(wèn)題:

有誤解,理解不透徹,有些急,最嚴(yán)重的是自己沒(méi)意識(shí)到這些。

然后快要期末考試了,各種高數(shù)大物,放下了一陣,偶爾看看一些零散的東西,也沒(méi)太記住。

轉(zhuǎn)

折出現(xiàn)在這個(gè)寒假,到家后還在看這本書,主要看閉包,沒(méi)幾天有了自己的電腦,終于迎來(lái)了代碼實(shí)踐,但當(dāng)時(shí)特別想架站,就去看深入淺出nodejs(真心是

本好書,會(huì)上癮的那種精彩),這本書我還看不太懂,但我在讀他的時(shí)候突然意識(shí)到了自己之前看的js高級(jí)程序設(shè)計(jì)根本沒(méi)看到家,連門都沒(méi)摸到,然后重新去

讀,又有了一些新的感悟和動(dòng)力,然后這兩本書穿插著讀,在看一些偏應(yīng)用的知識(shí),感覺(jué)好充實(shí),這種充實(shí)是種很棒的讀下去的動(dòng)力。

回到你的問(wèn)題,直到現(xiàn)在,我仍然為自己在學(xué)習(xí)時(shí)無(wú)名的焦躁,急切,挫敗感,無(wú)知的自信,自以為是感到深深地后怕,但現(xiàn)在自己還沒(méi)擺脫他們。我很理解你的問(wèn)題,我的建議就是簡(jiǎn)單的“不要著急,靜下心來(lái)慢慢看”。

如果你像我一樣基礎(chǔ)不好,就別想著會(huì)讀著多順利,可以先適當(dāng)放一下難點(diǎn),多想想是什么亂七八糟的需求產(chǎn)生了這樣亂七八糟的代碼,理解到了就會(huì)深深地感受的這些創(chuàng)作者的智慧。

javascript垃圾回收方法?

一、垃圾回收的必要性

下面這段話引自《JavaScript權(quán)威指南(第四版)》

由于字符串、對(duì)象和數(shù)組沒(méi)有固定大小,所有當(dāng)他們的大小已知時(shí),才能對(duì)他們進(jìn)行動(dòng)態(tài)的存儲(chǔ)分配。JavaScript程序每次創(chuàng)建字符串、數(shù)組或?qū)ο髸r(shí),解釋器都必須分配內(nèi)存來(lái)存儲(chǔ)那個(gè)實(shí)體。只要像這樣動(dòng)態(tài)地分配了內(nèi)存,最終都要釋放這些內(nèi)存以便他們能夠被再用,否則,JavaScript的解釋器將會(huì)消耗完系統(tǒng)中所有可用的內(nèi)存,造成系統(tǒng)崩潰。

這段話解釋了為什么需要系統(tǒng)需要垃圾回收,JS不像C/C++,他有自己的一套垃圾回收機(jī)制(Garbage Collection)。JavaScript的解釋器可以檢測(cè)到何時(shí)程序不再使用一個(gè)對(duì)象了,當(dāng)他確定了一個(gè)對(duì)象是無(wú)用的時(shí)候,他就知道不再需要這個(gè)對(duì)象,可以把它所占用的內(nèi)存釋放掉了。例如:

var a = "before";

var b = "override a";

var a = b; //重寫a

這段代碼運(yùn)行之后,“before”這個(gè)字符串失去了引用(之前是被a引用),系統(tǒng)檢測(cè)到這個(gè)事實(shí)之后,就會(huì)釋放該字符串的存儲(chǔ)空間以便這些空間可以被再利用。

二、垃圾回收原理淺析

現(xiàn)在各大瀏覽器通常用采用的垃圾回收有兩種方法:標(biāo)記清除、引用計(jì)數(shù)。

1、標(biāo)記清除

這是javascript中最常用的垃圾回收方式。當(dāng)變量進(jìn)入執(zhí)行環(huán)境是,就標(biāo)記這個(gè)變量為“進(jìn)入環(huán)境”。從邏輯上講,永遠(yuǎn)不能釋放進(jìn)入環(huán)境的變量所占用的內(nèi)存,因?yàn)橹灰獔?zhí)行流進(jìn)入相應(yīng)的環(huán)境,就可能會(huì)用到他們。當(dāng)變量離開(kāi)環(huán)境時(shí),則將其標(biāo)記為“離開(kāi)環(huán)境”。

垃圾收集器在運(yùn)行的時(shí)候會(huì)給存儲(chǔ)在內(nèi)存中的所有變量都加上標(biāo)記。然后,它會(huì)去掉環(huán)境中的變量以及被環(huán)境中的變量引用的標(biāo)記。而在此之后再被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無(wú)法訪問(wèn)到這些變量了。最后。垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值,并回收他們所占用的內(nèi)存空間。

關(guān)于這一塊,建議讀讀Tom大叔的幾篇文章,關(guān)于作用域鏈的一些知識(shí)詳解,讀完差不多就知道了,哪些變量會(huì)被做標(biāo)記。

2、引用計(jì)數(shù)

另一種不太常見(jiàn)的垃圾回收策略是引用計(jì)數(shù)。引用計(jì)數(shù)的含義是跟蹤記錄每個(gè)值被引用的次數(shù)。當(dāng)聲明了一個(gè)變量并將一個(gè)引用類型賦值給該變量時(shí),則這個(gè)值的引用次數(shù)就是1。相反,如果包含對(duì)這個(gè)值引用的變量又取得了另外一個(gè)值,則這個(gè)值的引用次數(shù)就減1。當(dāng)這個(gè)引用次數(shù)變成0時(shí),則說(shuō)明沒(méi)有辦法再訪問(wèn)這個(gè)值了,因而就可以將其所占的內(nèi)存空間給收回來(lái)。這樣,垃圾收集器下次再運(yùn)行時(shí),它就會(huì)釋放那些引用次數(shù)為0的值所占的內(nèi)存。

但是用這種方法存在著一個(gè)問(wèn)題,下面來(lái)看看代碼:

function problem() {

var objA = new Object();

var objB = new Object();

objA.someOtherObject = objB;

objB.anotherObject = objA;

}

在這個(gè)例子中,objA和objB通過(guò)各自的屬性相互引用;也就是說(shuō)這兩個(gè)對(duì)象的引用次數(shù)都是2。在采用引用計(jì)數(shù)的策略中,由于函數(shù)執(zhí)行之后,這兩個(gè)對(duì)象都離開(kāi)了作用域,函數(shù)執(zhí)行完成之后,objA和objB還將會(huì)繼續(xù)存在,因?yàn)樗麄兊囊么螖?shù)永遠(yuǎn)不會(huì)是0。這樣的相互引用如果說(shuō)很大量的存在就會(huì)導(dǎo)致大量的內(nèi)存泄露。

我們知道,IE中有一部分對(duì)象并不是原生JavaScript對(duì)象。例如,其BOM和DOM中的對(duì)象就是使用C++以COM(Component Object?

Model,組件對(duì)象)對(duì)象的形式實(shí)現(xiàn)的,而COM對(duì)象的垃圾回收器就是采用的引用計(jì)數(shù)的策略。因此,即使IE的Javascript引擎使用標(biāo)記清除的策略來(lái)實(shí)現(xiàn)的,但JavaScript訪問(wèn)的COM對(duì)象依然是基于引用計(jì)數(shù)的策略的。說(shuō)白了,只要IE中涉及COM對(duì)象,就會(huì)存在循環(huán)引用的問(wèn)題??纯聪旅娴倪@個(gè)簡(jiǎn)單的例子:

var element = document.getElementById("some_element");

var myObj =new Object();

myObj.element = element;

element.someObject = myObj;

上面這個(gè)例子中,在一個(gè)DOM元素(element)與一個(gè)原生JavaScript對(duì)象(myObj)之間建立了循環(huán)引用。其中,變量myObj有一個(gè)名為element的屬性指向element;而變量element有一個(gè)名為someObject的屬性回指到myObj。由于循環(huán)引用,即使將例子中的DOM從頁(yè)面中移除,內(nèi)存也永遠(yuǎn)不會(huì)回收。

不過(guò)上面的問(wèn)題也不是不能解決,我們可以手動(dòng)切斷他們的循環(huán)引用。

myObj.element = null;

element.someObject =null;

這樣寫代碼的話就可以解決循環(huán)引用的問(wèn)題了,也就防止了內(nèi)存泄露的問(wèn)題。

三、減少JavaScript中的垃圾回收

首先,最明顯的,new關(guān)鍵字就意味著一次內(nèi)存分配,例如 new Foo()。最好的處理方法是:在初始化的時(shí)候新建對(duì)象,然后在后續(xù)過(guò)程中盡量多的重用這些創(chuàng)建好的對(duì)象。

另外還有以下三種內(nèi)存分配表達(dá)式(可能不像new關(guān)鍵字那么明顯了):

{} (創(chuàng)建一個(gè)新對(duì)象)

[] (創(chuàng)建一個(gè)新數(shù)組)

function() {…} (創(chuàng)建一個(gè)新的方法,注意:新建方法也會(huì)導(dǎo)致垃圾收集?。?

1、對(duì)象object優(yōu)化

為了最大限度的實(shí)現(xiàn)對(duì)象的重用,應(yīng)該像避使用new語(yǔ)句一樣避免使用{}來(lái)新建對(duì)象。

{“foo”:”bar”}這種方式新建的帶屬性的對(duì)象,常常作為方法的返回值來(lái)使用,可是這將會(huì)導(dǎo)致過(guò)多的內(nèi)存創(chuàng)建,因此最好的解決辦法是:每一次函數(shù)調(diào)用完成之后,將需要返回的數(shù)據(jù)放入一個(gè)全局的對(duì)象中,并返回此全局對(duì)象。如果使用這種方式,就意味著每一次方法調(diào)用都會(huì)導(dǎo)致全局對(duì)象內(nèi)容的修改,這有可能會(huì)導(dǎo)致錯(cuò)誤的發(fā)生。因此,一定要對(duì)此全局對(duì)象的使用進(jìn)行詳細(xì)的注釋和說(shuō)明。

有一種方式能夠保證對(duì)象(確保對(duì)象prototype上沒(méi)有屬性)的重復(fù)利用,那就是遍歷此對(duì)象的所有屬性,并逐個(gè)刪除,最終將對(duì)象清理為一個(gè)空對(duì)象。

cr.wipe(obj)方法就是為此功能而生,代碼如下:

// 刪除obj對(duì)象的所有屬性,高效的將obj轉(zhuǎn)化為一個(gè)嶄新的對(duì)象!

cr.wipe = function (obj) {

for (var p in obj) {

? if (obj.hasOwnProperty(p))

? ? ?delete obj[p];

}

};? ? ?

有些時(shí)候,你可以使用cr.wipe(obj)方法清理對(duì)象,再為obj添加新的屬性,就可以達(dá)到重復(fù)利用對(duì)象的目的。雖然通過(guò)清空一個(gè)對(duì)象來(lái)獲取“新對(duì)象”的做法,比簡(jiǎn)單的通過(guò){}來(lái)創(chuàng)建對(duì)象要耗時(shí)一些,但是在實(shí)時(shí)性要求很高的代碼中,這一點(diǎn)短暫的時(shí)間消耗,將會(huì)有效的減少垃圾堆積,并且最終避免垃圾回收暫停,這是非常值得的!

2、數(shù)組array優(yōu)化

將[]賦值給一個(gè)數(shù)組對(duì)象,是清空數(shù)組的捷徑(例如: arr = [];),但是需要注意的是,這種方式又創(chuàng)建了一個(gè)新的空對(duì)象,并且將原來(lái)的數(shù)組對(duì)象變成了一小片內(nèi)存垃圾!實(shí)際上,將數(shù)組長(zhǎng)度賦值為0(arr.length = 0)也能達(dá)到清空數(shù)組的目的,并且同時(shí)能實(shí)現(xiàn)數(shù)組重用,減少內(nèi)存垃圾的產(chǎn)生。

3、方法function優(yōu)化

方法一般都是在初始化的時(shí)候創(chuàng)建,并且此后很少在運(yùn)行時(shí)進(jìn)行動(dòng)態(tài)內(nèi)存分配,這就使得導(dǎo)致內(nèi)存垃圾產(chǎn)生的方法,找起來(lái)就不是那么容易了。但是從另一角度來(lái)說(shuō),這更便于我們尋找了,因?yàn)橹灰莿?dòng)態(tài)創(chuàng)建方法的地方,就有可能產(chǎn)生內(nèi)存垃圾。例如:將方法作為返回值,就是一個(gè)動(dòng)態(tài)創(chuàng)建方法的實(shí)例。

在游戲的主循環(huán)中,setTimeout或requestAnimationFrame來(lái)調(diào)用一個(gè)成員方法是很常見(jiàn)的,例如:

setTimeout(

(function(self) {? ? ? ? ? ? ? ? ?

return function () {

? ? ? ?self.tick();

};

})(this), 16)

每過(guò)16毫秒調(diào)用一次this.tick(),嗯,乍一看似乎沒(méi)什么問(wèn)題,但是仔細(xì)一琢磨,每一次調(diào)用都返回了一個(gè)新的方法對(duì)象,這就導(dǎo)致了大量的方法對(duì)象垃圾!

為了解決這個(gè)問(wèn)題,可以將作為返回值的方法保存起來(lái),例如:

// at startup

this.tickFunc = (

function(self) {

return function() {

? ? ? ? ?self.tick();

};

}

)(this);

// in the tick() function

setTimeout(this.tickFunc, 16);

相比于每次都新建一個(gè)方法對(duì)象,這種方式在每一幀當(dāng)中重用了相同的方法對(duì)象。這種方式的優(yōu)勢(shì)是顯而易見(jiàn)的,而這種思想也可以應(yīng)用在任何以方法為返回值或者在運(yùn)行時(shí)創(chuàng)建方法的情況當(dāng)中。

4、高級(jí)技術(shù)

從根本上來(lái)說(shuō),javascript本身就是圍繞著垃圾收集來(lái)設(shè)計(jì)的。隨著我們工作的進(jìn)行,避免內(nèi)存垃圾變得越來(lái)越困難。因?yàn)楹芏喾奖銓?shí)用的Javascript庫(kù)方法也會(huì)產(chǎn)生一些新的對(duì)象。對(duì)于這些庫(kù)方法產(chǎn)生的垃圾,我們束手無(wú)策,只能重新翻看文檔,并且檢查方法的返回值。例如,數(shù)組的slice方法返回一個(gè)新的數(shù)組(在不修改原數(shù)組的基礎(chǔ)上,截取出一部分作為新數(shù)組),字符串的substr方法返回一個(gè)新的字符串(在不修改原字符串的基礎(chǔ)上,截取出一部分字符串作為返回值)等等。

調(diào)用這些庫(kù)方法,將會(huì)創(chuàng)建內(nèi)存垃圾,而你能做的,只有避免調(diào)用這些方法,或者用不創(chuàng)建系統(tǒng)垃圾的方式重寫這些方法(有點(diǎn)極端啦~)。

例如,在Construct 2引擎中,從數(shù)組中利用下標(biāo)來(lái)刪除一個(gè)元素,是經(jīng)常進(jìn)行的操作。最初我們是用下面這種方式來(lái)實(shí)現(xiàn)的:

var sliced = arr.slice(index + 1);

arr.length = index;

arr.push.apply(arr, sliced);

然而,slice方法會(huì)返回一個(gè)新的數(shù)組對(duì)象(數(shù)組中的元素是原數(shù)組中刪掉的部分),并且會(huì)通過(guò)arr.push.apply方法將元素重新復(fù)制回原數(shù)組,但是在此操作之后,該數(shù)組就成為了一片內(nèi)存垃圾。由于這是我們引擎中的垃圾產(chǎn)生的熱點(diǎn)代碼(使用頻率非常很高),因此我們利用了迭代的方式重寫了上述代碼:

for (var i = index, len = arr.length – 1; i len; i++)

arr[i] = arr[i + 1];

arr.length = len;

顯然,重寫大量的庫(kù)函數(shù)是非常痛苦的,因此你必須仔細(xì)權(quán)衡方法的易用性和內(nèi)存垃圾產(chǎn)生情況。如果產(chǎn)生大量?jī)?nèi)存垃圾的方法在動(dòng)畫的每一幀中被多次調(diào)用,你可能就會(huì)興高采烈的重寫庫(kù)函數(shù)啦。

在遞歸函數(shù)中,通過(guò){}構(gòu)造空對(duì)象,并在遞歸過(guò)程中傳遞數(shù)據(jù),雖然是很方便的。但是更好的方式是:利用一個(gè)單獨(dú)的數(shù)組對(duì)象作為堆棧,在遞歸過(guò)程中對(duì)數(shù)組進(jìn)行push和pop操作。更進(jìn)一步,不要調(diào)用array的pop方法(pop將會(huì)使得array的最后一個(gè)元素將會(huì)變成內(nèi)存垃圾),而應(yīng)該使用一個(gè)索引來(lái)記錄數(shù)組的最后一個(gè)元素的位置,在pop時(shí)簡(jiǎn)單的將索引減一即可;類似的,將索引加1來(lái)代替array的push操作,只有當(dāng)索引對(duì)應(yīng)的元素不存在時(shí),才執(zhí)行真正的push為數(shù)組加入一個(gè)新元素。

另外,在任何時(shí)候,都應(yīng)該避免使用向量對(duì)象(例如:包含x和y屬性的vector2對(duì)象)。有些方法將向量對(duì)象作為方法返回值,既可以支持返回值的再次修改,又能夠?qū)⑿枰膶傩砸淮涡苑祷?,使用起?lái)非常方便。但是有時(shí)候在一幀動(dòng)畫中,創(chuàng)建了成百上千個(gè)這樣的向量對(duì)象,從而導(dǎo)致嚴(yán)重的垃圾回收性能問(wèn)題,也是非常常見(jiàn)的。因此最好將這些方法分離成具有獨(dú)立職責(zé)的功能個(gè)體,例如:利用getX()和getY()方法(返回具體數(shù)據(jù))代替getPosition()方法(返回一個(gè)vector2對(duì)象)。

四、總結(jié)

在Javascript中,徹底避免垃圾回收是非常困難的。垃圾回收機(jī)制與實(shí)時(shí)軟件(例如:游戲)的實(shí)時(shí)性要求,從根本上就是對(duì)立的。

但是,為了減少內(nèi)存垃圾,我們還是可以對(duì)javascript代碼進(jìn)行徹底檢查,有些代碼中存在明顯的產(chǎn)生過(guò)多內(nèi)存垃圾的問(wèn)題代碼,這些正是我們需要檢查并且完善的。

我認(rèn)為,只要我們投入更多的精力和關(guān)注,實(shí)現(xiàn)實(shí)時(shí)的、低垃圾收集的javascript應(yīng)用還是很有可能的。畢竟,對(duì)于可交互性要求較高的游戲或應(yīng)用來(lái)說(shuō),實(shí)時(shí)性和低垃圾收集,兩者都是至關(guān)重要。


名稱欄目:javascript捷徑,捷徑運(yùn)行javascript
網(wǎng)站網(wǎng)址:http://weahome.cn/article/dseiogd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部