摘要:匿名函數(shù)可以用來模仿塊級(jí)作用域來避免這個(gè)問題這里是塊級(jí)作用域代碼定義并立即調(diào)用了一個(gè)匿名函數(shù),將函數(shù)聲明包含在一對(duì)圓括號(hào)中,表示它實(shí)際上是一個(gè)函數(shù)表達(dá)式,而緊隨其后的另一對(duì)圓括號(hào)會(huì)立即調(diào)用這個(gè)函數(shù)。
函數(shù)表達(dá)式 遞歸
遞歸函數(shù)是在一個(gè)函數(shù)通過名字調(diào)用自身的情況下構(gòu)成的
function factrial(num){ if(num<=1){ return 1; }else { return num*factrial(num-1); } }
argument.callee是一個(gè)指向正在執(zhí)行的函數(shù)的指針,因此可以用它來實(shí)現(xiàn)對(duì)函數(shù)的遞歸調(diào)用
function factorial(num){ if(num<=1){ return 1; }else { return num*argument.callee(num-1) } }
嚴(yán)格模式下不能通過腳本訪問argument.callee,訪問這個(gè)屬性會(huì)導(dǎo)致錯(cuò)誤,不過可以使用命名函數(shù)表達(dá)式類達(dá)成相同的結(jié)果
var factorial=(function f(num){ if(num<=1){ return 1; }else { return num*f(num-1); } })閉包
閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)
function compare(value1,value2){ if(value1value2){ return 1; }else { return 0; } } var result=compare(5,10)
//創(chuàng)建函數(shù) var compareNames = createComparisonFunction("name"); //調(diào)用函數(shù) var result = compareNames({ name: "Nicholas" }, { name: "Greg" }); //解除對(duì)匿名函數(shù)的引用(以便釋放內(nèi)存) compareNames = null;閉包與變量
閉包只能取得包含函數(shù)中任何變量的最后一個(gè)值,i值為10
function creatFunctions(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(){ return i; }; }; return result; }
通過匿名函數(shù)強(qiáng)制讓閉包的行為符合預(yù)期
function createFuntion(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(num){ return function(){ return num; }; }(i); } return result; }關(guān)于this對(duì)象
匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其this對(duì)象通常指向window
把外部作用域中的this對(duì)象保存在一個(gè)閉包能夠訪問到的變量里,就可以了讓閉包訪問這個(gè)對(duì)象了
var name="The Window"; var object={ name:"My Object", getNameFunc:function(){ var that=this; return function(){ return that.name }; } }; alert(object.getNameFunc()());//"My Object"
定義米明函數(shù)之前,我們把this對(duì)象賦值給了一個(gè)名叫that的變量,而在定義了這個(gè)閉包之后,閉包也可以訪問這個(gè)變量,因此它是我們?cè)诎瘮?shù)中特意聲明的一個(gè)變量,即使在函數(shù)返回之后,that也仍然引用這object
內(nèi)存泄漏
如果閉包作用域中保存著一個(gè)HTML元素,那么久意味著該元素將無法被銷毀
function assignHandler(){ var element=docunemt.getElementById("someElement"); element.onclick=function(){ alert(element.id) } }
以上代碼段中的element占用的內(nèi)存永遠(yuǎn)不會(huì)被回收
function assignHandler(){ var element=document.getElementById("someElement"); var id=element.id; element.onclick=function(){ alert(id); } element=null; }模仿塊級(jí)作用域
function outputNumbers(count){ for(var i=0;i
JavaScript從來不會(huì)告訴你是否多次聲明了同一個(gè)變量,遇到這種情況,只會(huì)對(duì)后續(xù)的聲明視而不見,不過會(huì)執(zhí)行后續(xù)聲明中的變量初始化。匿名函數(shù)可以用來模仿塊級(jí)作用域來避免這個(gè)問題
(function(){ //這里是塊級(jí)作用域 })()
代碼定義并立即調(diào)用了一個(gè)匿名函數(shù),將函數(shù)聲明包含在一對(duì)圓括號(hào)中,表示它實(shí)際上是一個(gè)函數(shù)表達(dá)式,而緊隨其后的另一對(duì)圓括號(hào)會(huì)立即調(diào)用這個(gè)函數(shù)。
function outputNumbers(count){ (function(){ for(var i=0;i這種技術(shù)經(jīng)常在全局作用域中被用在函數(shù)外部,從而限制向全局作用域中添加過多的變量和函數(shù)。一般來說,我們應(yīng)該盡量少向全局作用域中添加變量和函數(shù)
私有變量JavaScript中滅有私有成員的概念,所以對(duì)象屬性都是共有的。任何在函數(shù)中定義的變量,都可以認(rèn)為是私有變量,因?yàn)椴荒茉诤瘮?shù)的外部訪問這些變量,私有變量包括函數(shù)的參數(shù)、局部變量和在函數(shù)內(nèi)部定義的其他函數(shù)。
如果在函數(shù)內(nèi)部創(chuàng)建一個(gè)閉包,那么閉包通過自己的作用域鏈也可以訪問函數(shù)內(nèi)的變量
靜態(tài)私有變量(funciton(){ //私有變量和私有函數(shù) var privateVariable=10; function privateFunction(){ return false; } //構(gòu)造函數(shù) MyObject=function(){} //公有/特權(quán)方法 MyObject.prototype.publicMethod=function(){ privateVariable++; return privateFunciton(); } })();在私有作用域中,首先定義了私有變量和私有函數(shù),然后又定義了構(gòu)造函數(shù)及其公有方法
模塊模式
模塊模式是為單例創(chuàng)建私有變量和特權(quán)方法。單例指的就是只有一個(gè)實(shí)例的對(duì)象。按照慣例,JavaScript是以字面量的方式來創(chuàng)建單例對(duì)象的
var singleton={ name:value, method:function(){ //這里是代碼方法 } }
模塊模式通過為單例添加私有變量和特權(quán)的方法能夠使其得到增強(qiáng)
var singleton=function(){ //私有變量和私有函數(shù) var privateVariable=10; funciton privateFunction(){ return false; } //特權(quán)/公有方法和屬性 return { publicProperty:true, publicMethod:function(){ privateVariable++; return privateFunction(); } }; }();增強(qiáng)的模塊模式var application = function(){ //私有變量和函數(shù) var components = new Array(); //初始化 components.push(new BaseComponent()); //創(chuàng)建 application 的一個(gè)局部副本 var app = new BaseComponent(); //公共接口 app.getComponentCount = function(){ return components.length; }; app.registerComponent = function(component){ if (typeof component == "object"){ components.push(component); } }; //返回這個(gè)副本/ return app; }();
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97620.html
錯(cuò)誤處理與調(diào)試 錯(cuò)誤處理 try-catch語句 try{ //可能會(huì)導(dǎo)致錯(cuò)誤的代碼 }catch(error){ //在錯(cuò)誤發(fā)生時(shí)怎么處理 } 發(fā)生錯(cuò)誤時(shí)可以顯示瀏覽器給出的信息 try{ window.someNonexistentFunction(); }catch(error){ alert(error.message); } 在try-catch語句中是可選的,但...
摘要:在基于使用命名空間的文檔求值時(shí),需要使用對(duì)象。第四個(gè)參數(shù)的取值類型是下列常量之一,返回與表達(dá)式匹配的數(shù)據(jù)類型。,返回字符串值。這是最常用的結(jié)果類型。集合中節(jié)點(diǎn)的次序與它們?cè)谖臋n中的次序一致。 JavaScript與XML 瀏覽器對(duì)XML DOM的支持 DOM2級(jí)核心 在通過JavaScript處理XML時(shí),通常只使用參數(shù)root,因?yàn)檫@個(gè)參數(shù)指定的是XML DOM文檔元素的標(biāo)簽名 v...
摘要:對(duì)象的核心對(duì)象是,它表示瀏覽器的一個(gè)實(shí)例。而和則表示該容器中頁面視圖區(qū)的大小。在中,與返回相同的值,即視口大小而非瀏覽器窗口大小。第三個(gè)參數(shù)是一個(gè)逗號(hào)分隔的設(shè)置字符串,表示在新窗口中都顯示哪些特性。這應(yīng)該是用戶打開窗口后的第一個(gè)頁面 BOM window對(duì)象 BOM的核心對(duì)象是window,它表示瀏覽器的一個(gè)實(shí)例。在瀏覽器中,window對(duì)象有雙重角色,它既是通過JavaScript訪...
摘要:能力檢測無法精確地檢測特定的瀏覽器和版本。用戶代理檢測通過檢測用戶代理字符串來識(shí)別瀏覽器。用戶代理檢測需要特殊的技巧,特別是要注意會(huì)隱瞞其用戶代理字符串的情況。 客戶端檢測 能力檢測 能力檢測的目的不是識(shí)別特定的瀏覽器,而是識(shí)別瀏覽器的能力,采用這種方式不必顧忌特定的瀏覽器,只要確定瀏覽器支持的特定的能力,就能給出解決方案,檢測基本模式 if(object.propertyInQu...
表單腳本 表單的基礎(chǔ)知識(shí) HTMLFormElement有自己獨(dú)特的屬性和方法 acceptCharset,服務(wù)器能夠處理的字符集,等價(jià)于HTML中的accept-charset特性 action,接受請(qǐng)求的URL,等價(jià)于HTML中的action特性 elements,表單中所有控件的集合 enctype,請(qǐng)求的編碼類型,等價(jià)于HTML中的enctype特性 length,表單中控件的數(shù)量 m...
閱讀 970·2022-06-21 15:13
閱讀 1855·2021-10-20 13:48
閱讀 1039·2021-09-22 15:47
閱讀 1373·2019-08-30 15:55
閱讀 3128·2019-08-30 15:53
閱讀 526·2019-08-29 12:33
閱讀 721·2019-08-28 18:15
閱讀 3467·2019-08-26 13:58