成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

高程3總結(jié)#第7章函數(shù)表達(dá)式

sevi_stuo / 628人閱讀

摘要:匿名函數(shù)可以用來模仿塊級作用域來避免這個問題這里是塊級作用域代碼定義并立即調(diào)用了一個匿名函數(shù),將函數(shù)聲明包含在一對圓括號中,表示它實際上是一個函數(shù)表達(dá)式,而緊隨其后的另一對圓括號會立即調(diào)用這個函數(shù)。

函數(shù)表達(dá)式 遞歸

遞歸函數(shù)是在一個函數(shù)通過名字調(diào)用自身的情況下構(gòu)成的

function factrial(num){
  if(num<=1){
    return 1;
  }else {
    return num*factrial(num-1);
  }
}

argument.callee是一個指向正在執(zhí)行的函數(shù)的指針,因此可以用它來實現(xiàn)對函數(shù)的遞歸調(diào)用

function factorial(num){
  if(num<=1){
    return 1;
  }else {
    return num*argument.callee(num-1)
  }
}

嚴(yán)格模式下不能通過腳本訪問argument.callee,訪問這個屬性會導(dǎo)致錯誤,不過可以使用命名函數(shù)表達(dá)式類達(dá)成相同的結(jié)果

var factorial=(function f(num){
  if(num<=1){
    return 1;
  }else {
    return num*f(num-1);
  }
})

閉包

閉包是指有權(quán)訪問另一個函數(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" });
//解除對匿名函數(shù)的引用(以便釋放內(nèi)存)
compareNames = null;

閉包與變量

閉包只能取得包含函數(shù)中任何變量的最后一個值,i值為10

function creatFunctions(){
  var result=new Array();
  for(var i=0;i<10;i++){
    result[i]=function(){
      return i;
    };
  };
  return result;
}

通過匿名函數(shù)強制讓閉包的行為符合預(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對象

匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其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"

定義米明函數(shù)之前,我們把this對象賦值給了一個名叫that的變量,而在定義了這個閉包之后,閉包也可以訪問這個變量,因此它是我們在包含函數(shù)中特意聲明的一個變量,即使在函數(shù)返回之后,that也仍然引用這object

內(nèi)存泄漏

如果閉包作用域中保存著一個HTML元素,那么久意味著該元素將無法被銷毀

function assignHandler(){
  var element=docunemt.getElementById("someElement");
  element.onclick=function(){
    alert(element.id)
  }
}

以上代碼段中的element占用的內(nèi)存永遠(yuǎn)不會被回收

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從來不會告訴你是否多次聲明了同一個變量,遇到這種情況,只會對后續(xù)的聲明視而不見,不過會執(zhí)行后續(xù)聲明中的變量初始化。匿名函數(shù)可以用來模仿塊級作用域來避免這個問題

(function(){
  //這里是塊級作用域
})()

代碼定義并立即調(diào)用了一個匿名函數(shù),將函數(shù)聲明包含在一對圓括號中,表示它實際上是一個函數(shù)表達(dá)式,而緊隨其后的另一對圓括號會立即調(diào)用這個函數(shù)。

function outputNumbers(count){
  (function(){
    for(var i=0;i

這種技術(shù)經(jīng)常在全局作用域中被用在函數(shù)外部,從而限制向全局作用域中添加過多的變量和函數(shù)。一般來說,我們應(yīng)該盡量少向全局作用域中添加變量和函數(shù)

私有變量

JavaScript中滅有私有成員的概念,所以對象屬性都是共有的。任何在函數(shù)中定義的變量,都可以認(rèn)為是私有變量,因為不能在函數(shù)的外部訪問這些變量,私有變量包括函數(shù)的參數(shù)、局部變量和在函數(shù)內(nèi)部定義的其他函數(shù)。

如果在函數(shù)內(nèi)部創(chuàng)建一個閉包,那么閉包通過自己的作用域鏈也可以訪問函數(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)方法。單例指的就是只有一個實例的對象。按照慣例,JavaScript是以字面量的方式來創(chuàng)建單例對象的

var singleton={
  name:value,
  method:function(){
    //這里是代碼方法
  }
}

模塊模式通過為單例添加私有變量和特權(quán)的方法能夠使其得到增強

var singleton=function(){
  //私有變量和私有函數(shù)
  var privateVariable=10;
  funciton privateFunction(){
    return false;
  }
  //特權(quán)/公有方法和屬性
  return {
    publicProperty:true,
    publicMethod:function(){
      privateVariable++;
      return privateFunction();
    }
  };
}();

增強的模塊模式
var application = function(){
//私有變量和函數(shù)
var components = new Array();
//初始化
components.push(new BaseComponent());
//創(chuàng)建 application 的一個局部副本
var app = new BaseComponent();
//公共接口
app.getComponentCount = function(){
  return components.length;
};
app.registerComponent = function(component){
  if (typeof component == "object"){
    components.push(component);
  }
};
//返回這個副本/
return app;
}();

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97620.html

相關(guān)文章

  • 高程3總結(jié)#17錯誤處理與調(diào)試

    錯誤處理與調(diào)試 錯誤處理 try-catch語句 try{ //可能會導(dǎo)致錯誤的代碼 }catch(error){ //在錯誤發(fā)生時怎么處理 } 發(fā)生錯誤時可以顯示瀏覽器給出的信息 try{ window.someNonexistentFunction(); }catch(error){ alert(error.message); } 在try-catch語句中是可選的,但...

    fizz 評論0 收藏0
  • 高程3總結(jié)#18JavaScript與XML

    摘要:在基于使用命名空間的文檔求值時,需要使用對象。第四個參數(shù)的取值類型是下列常量之一,返回與表達(dá)式匹配的數(shù)據(jù)類型。,返回字符串值。這是最常用的結(jié)果類型。集合中節(jié)點的次序與它們在文檔中的次序一致。 JavaScript與XML 瀏覽器對XML DOM的支持 DOM2級核心 在通過JavaScript處理XML時,通常只使用參數(shù)root,因為這個參數(shù)指定的是XML DOM文檔元素的標(biāo)簽名 v...

    gaosboy 評論0 收藏0
  • 高程3總結(jié)#8BOM

    摘要:對象的核心對象是,它表示瀏覽器的一個實例。而和則表示該容器中頁面視圖區(qū)的大小。在中,與返回相同的值,即視口大小而非瀏覽器窗口大小。第三個參數(shù)是一個逗號分隔的設(shè)置字符串,表示在新窗口中都顯示哪些特性。這應(yīng)該是用戶打開窗口后的第一個頁面 BOM window對象 BOM的核心對象是window,它表示瀏覽器的一個實例。在瀏覽器中,window對象有雙重角色,它既是通過JavaScript訪...

    MASAILA 評論0 收藏0
  • 高程3總結(jié)#9客戶端檢測

    摘要:能力檢測無法精確地檢測特定的瀏覽器和版本。用戶代理檢測通過檢測用戶代理字符串來識別瀏覽器。用戶代理檢測需要特殊的技巧,特別是要注意會隱瞞其用戶代理字符串的情況。 客戶端檢測 能力檢測 能力檢測的目的不是識別特定的瀏覽器,而是識別瀏覽器的能力,采用這種方式不必顧忌特定的瀏覽器,只要確定瀏覽器支持的特定的能力,就能給出解決方案,檢測基本模式 if(object.propertyInQu...

    BigNerdCoding 評論0 收藏0
  • 高程3總結(jié)#14表單腳本

    表單腳本 表單的基礎(chǔ)知識 HTMLFormElement有自己獨特的屬性和方法 acceptCharset,服務(wù)器能夠處理的字符集,等價于HTML中的accept-charset特性 action,接受請求的URL,等價于HTML中的action特性 elements,表單中所有控件的集合 enctype,請求的編碼類型,等價于HTML中的enctype特性 length,表單中控件的數(shù)量 m...

    Tony 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<