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