亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

javascript基礎(chǔ)-函數(shù)

QLQ / 705人閱讀

摘要:在函數(shù)內(nèi)部定義的匿名函數(shù)的作用域鏈中,不包含外部函數(shù)的活動(dòng)對(duì)象。在執(zhí)行完畢以后,其執(zhí)行環(huán)境的作用域鏈被銷毀,但是其活動(dòng)對(duì)象不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈中仍然引用著這個(gè)活動(dòng)對(duì)象,直到匿名函數(shù)執(zhí)行完畢后,才一起被銷毀。

函數(shù)表達(dá)式和函數(shù)聲明

函數(shù)聲明:function 函數(shù)名稱 (參數(shù):可選){ 函數(shù)體 }

函數(shù)表達(dá)式:function 函數(shù)名稱(可選)(參數(shù):可選){ 函數(shù)體 }
函數(shù)聲明只能出現(xiàn)在程序或函數(shù)體內(nèi)。從語(yǔ)法上講,它們不能出現(xiàn)在Block(塊)({ ... })中。表達(dá)式和聲明存在著十分微妙的差別,函數(shù)聲明會(huì)在任何表達(dá)式被解析和求值之前先被解析和求值。無(wú)論變量在函數(shù)內(nèi)何處聲明,在代碼執(zhí)行階段,變量都會(huì)在提到函數(shù)開始執(zhí)行之前被聲明,而函數(shù)聲明發(fā)生在更早的階段。

    var foo;
    if (true) {
       foo = function (){ console.log(1); };
    }else {
       foo = function (){ console.log(2); };
    }
    foo(); // 1

先聲明foo變量,在代碼處理的第一步,按照程序執(zhí)行順序,創(chuàng)建函數(shù)表達(dá)式并賦值給foo。
    if (true) {
       function foo(){ console.log(1); }
    }else {
       function foo(){ console.log(2); }
    }
    foo(); // 2

基于Gecko的瀏覽器 //1
函數(shù)聲明在代碼處理的第一步。function foo(){ console.log(2); }會(huì)覆蓋前面的操作。

  alert(sum(10,10));    //20
  function sum(num1, num2){
      return num1 + num2;
  }        
  alert(sum(10,10));    //causes an error
  var sum = function(num1, num2){
      return num1 + num2;
  };
  //變量sum的聲明還是放在第一步處理

命名函數(shù)表達(dá)式:var bar = function foo(){};需要注意的地方:這個(gè)名字只在新定義的函數(shù)作用域內(nèi)有效(IE9以前版本的IE版本中)。命名函數(shù)表達(dá)式方便調(diào)試。

    var f = function foo(){
      return typeof foo; // foo是在內(nèi)部作用域內(nèi)有效
    };
    // foo在外部用于是不可見的
    typeof foo; // "undefined"       IE5-IE8中 " function"
    f(); // "function"
調(diào)用模式

方法調(diào)用模式
當(dāng)一個(gè)函數(shù)保存為對(duì)象的一個(gè)屬性時(shí),我們稱它為方法。當(dāng)一個(gè)方法被調(diào)用的時(shí)候,this被綁定到該對(duì)象。如果調(diào)用表達(dá)式包含一個(gè)提取屬性的動(dòng)作xxx.xxx,那么它就是被當(dāng)做方法來(lái)調(diào)用的。

函數(shù)調(diào)用模式
this被綁定到全局對(duì)象。

構(gòu)造器調(diào)用模式
this被綁定到創(chuàng)建的新對(duì)象。

apply調(diào)用模式
apply允許我們選擇this的值,方法接受兩個(gè)參數(shù),第一個(gè)是要綁定this的值,第二個(gè)是參數(shù)數(shù)值。第一個(gè)參數(shù)為null,undefined將會(huì)被替換成全局對(duì)象。嚴(yán)格模式use strict的時(shí)候不會(huì)被替換。

作用域

很多現(xiàn)代語(yǔ)言都推薦延遲聲明變量,js中推薦在函數(shù)體的頂部聲明函數(shù)中可能用到的所有變量。
JScript的Bug

例1:函數(shù)表達(dá)式的標(biāo)示符泄露到外部作用域
typeof g; // "function"
var f = function g(){};
IE9已經(jīng)修復(fù)

例2:將命名函數(shù)表達(dá)式同時(shí)當(dāng)作函數(shù)聲明和函數(shù)表達(dá)式
typeof g; // "function"
var f = function g(){};

函數(shù)聲明會(huì)優(yōu)先于任何表達(dá)式被解析,上面的例子展示的是JScript實(shí)際上是把命名函數(shù)表達(dá)式當(dāng)成函數(shù)聲明了,因?yàn)樗趯?shí)際聲明之前就解析了g

匿名函數(shù)

匿名函數(shù)中this 一般指向window對(duì)象
XXXX.prototype.__XXX = function(){} 不是匿名函數(shù)

閉包

在編寫遞歸函數(shù)時(shí),使用arguments.callee (但是es5嚴(yán)格模式下會(huì)報(bào)錯(cuò))比使用函數(shù)名安全。
函數(shù)中的變量對(duì)象就是活動(dòng)對(duì)象。
無(wú)論什么時(shí)候在函數(shù)內(nèi)部訪問一個(gè)變量時(shí),就會(huì)從作用域鏈中搜索相應(yīng)變量。一般來(lái)講,當(dāng)函數(shù)執(zhí)行完畢后局部活動(dòng)對(duì)象將被銷毀。但是閉包情況有所不同。

在createComparisonFunction()函數(shù)內(nèi)部定義的匿名函數(shù)的作用域鏈中,不包含外部函數(shù)createComparisonFunction()的活動(dòng)對(duì)象。
var compare = createComparisonFunction("name");
var result = compare(obj1, obj2);
createComparisonFunction()在執(zhí)行完畢以后,其執(zhí)行環(huán)境的作用域鏈被銷毀,但是其活動(dòng)對(duì)象不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈中仍然引用著這個(gè)活動(dòng)對(duì)象,直到匿名函數(shù)執(zhí)行完畢后,才一起被銷毀。閉包會(huì)攜帶包含他的函數(shù)的作用域,占用內(nèi)存較多。

閉包與變量
閉包只能取得包含函數(shù)中變量最后保存的值。
function createFunctions() {
  var result = new Array();
  for (var i = 0; i < 10; i++) {
      result[i] = function() {
          return i;
      };
  }  
  return result;
}
var funcs = createFunctions();
//every function outputs 10
for (var i = 0; i < funcs.length; i++) {
  document.write(funcs[i]() + "
"); } 使用匿名函數(shù)再添加一層外部函數(shù),多了一個(gè)閉包使原來(lái)的閉包滿足條件 function createFunctions() { var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function(num) { return function() { return num; }; }(i); } return result; } var funcs = createFunctions(); //every function outputs 10 for (var i = 0; i < funcs.length; i++) { document.write(funcs[i]() + "
"); }
用閉包保存狀態(tài)

閉包直接可以引用傳入的參數(shù),利用這些被lock住的傳入?yún)?shù),自執(zhí)行函數(shù)表達(dá)式可以有效地保存狀態(tài)。

// 這個(gè)代碼是錯(cuò)誤的,因?yàn)樽兞縤從來(lái)就沒背locked住
// 相反,當(dāng)循環(huán)執(zhí)行以后,我們?cè)邳c(diǎn)擊的時(shí)候i才獲得數(shù)值
// 因?yàn)檫@個(gè)時(shí)候i操真正獲得值
// 所以說(shuō)無(wú)論點(diǎn)擊那個(gè)連接,最終顯示的都是I am link #10(如果有10個(gè)a元素的話)
var elems = document.getElementsByTagName("a");
for (var i = 0; i < elems.length; i++) {
  elems[i].addEventListener("click", function (e) {
      e.preventDefault();
      alert("I am link #" + i);
  }, "false");

}
// 這個(gè)是可以用的,因?yàn)樗谧詧?zhí)行函數(shù)表達(dá)式閉包內(nèi)部
// i的值作為locked的索引存在,在循環(huán)執(zhí)行結(jié)束以后,盡管最后i的值變成了a元素總數(shù)(例如10)
// 但閉包內(nèi)部的lockedInIndex值是沒有改變,因?yàn)樗呀?jīng)執(zhí)行完畢了
// 所以當(dāng)點(diǎn)擊連接的時(shí)候,結(jié)果是正確的

var elems = document.getElementsByTagName("a");
for (var i = 0; i < elems.length; i++) {
  (function (lockedInIndex) {
      elems[i].addEventListener("click", function (e) {
          e.preventDefault();
          alert("I am link #" + lockedInIndex);
      }, "false");
  })(i);
}

// 你也可以像下面這樣應(yīng)用,在處理函數(shù)那里使用自執(zhí)行函數(shù)表達(dá)式
// 而不是在addEventListener外部
// 但是相對(duì)來(lái)說(shuō),上面的代碼更具可讀性
var elems = document.getElementsByTagName("a");
for (var i = 0; i < elems.length; i++) {
  elems[i].addEventListener("click", (function (lockedInIndex) {
      return function (e) {
          e.preventDefault();
          alert("I am link #" + lockedInIndex);
      };
  })(i), "false");
}
自執(zhí)行函數(shù)表達(dá)式

利用了閉包的特性,可以避免全局變量

javascript語(yǔ)法中()內(nèi)部不能包含語(yǔ)句,只能包含表達(dá)式。
(function () { /* code */ } ()); // 推薦使用這個(gè)

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/91528.html

相關(guān)文章

  • 基礎(chǔ)鞏固:JavaScript基礎(chǔ)總結(jié)(基本概念篇)

    摘要:基礎(chǔ)鞏固基礎(chǔ)總結(jié)使用已經(jīng)好幾年了,由于工作主要是做服務(wù)端開發(fā),在工作中逐漸發(fā)現(xiàn)的使用范圍原來(lái)越廣泛。這里要注意,務(wù)必將基礎(chǔ)部分掌握牢靠,磨刀不誤砍柴功,只有將基礎(chǔ)部分掌握并建立起系統(tǒng)的知識(shí)體系,在后面學(xué)習(xí)衍生的其他模式才能游刃有余。 基礎(chǔ)鞏固:JavaScript基礎(chǔ)總結(jié) 使用JavaScript已經(jīng)好幾年了,由于工作主要是做服務(wù)端開發(fā),在工作中逐漸發(fā)現(xiàn)JavaScript的使用范圍原...

    YuboonaZhang 評(píng)論0 收藏0
  • 函數(shù) - Javascript語(yǔ)法基礎(chǔ) - Javascript核心

    摘要:在定義函數(shù)的作用域外調(diào)用,得到的返回仍然是函數(shù)創(chuàng)建時(shí)所在的作用域的局部變量。這是因?yàn)樗诘哪涿瘮?shù)的閉包中存放的是第一行的,而不是在循環(huán)中獲得的的當(dāng)前值。 原文: http://pij.robinqu.me/JavaScript_Core/JavaScript_Basics/Function.html 源代碼: https://github.com/RobinQu/Pr...

    wuaiqiu 評(píng)論0 收藏0
  • 十步零基礎(chǔ)JavaScript學(xué)習(xí)路徑

    摘要:之前寫過(guò)一篇天學(xué)通前端開發(fā),內(nèi)容主要講的就是前端學(xué)習(xí)路徑,今天再來(lái)寫一篇零基礎(chǔ)的學(xué)習(xí)路徑,希望能幫編程零基礎(chǔ)的前端愛好者指明方向。十框架三選一,零基礎(chǔ)的初學(xué)者強(qiáng)烈推薦,如果是后臺(tái)轉(zhuǎn)前端推薦,如果技術(shù)型前端,推薦。 之前寫過(guò)一篇26天學(xué)通前端開發(fā),內(nèi)容主要講的就是前端學(xué)習(xí)路徑,今天再來(lái)寫一篇零基礎(chǔ)的JavaScript學(xué)習(xí)路徑,希望能幫編程零基礎(chǔ)的前端愛好者指明方向。 一、開發(fā)環(huán)境和Ja...

    incredible 評(píng)論0 收藏0
  • Javascript學(xué)習(xí)總結(jié) - JS基礎(chǔ)系列一

    摘要:變量定義變量使用關(guān)鍵字變量名變量名可以任意取名,但要遵循命名規(guī)則變量必須使用字母下劃線或者美元符開始。語(yǔ)法參數(shù)說(shuō)明在消息對(duì)話框中要顯示的文本返回值值。返回值點(diǎn)擊確定按鈕,文本框中的內(nèi)容將作為函數(shù)返回值。 簡(jiǎn)述 本系列將持續(xù)更新Javascript基礎(chǔ)部分的知識(shí),誰(shuí)都想掌握高端大氣的技術(shù),但是我覺得沒有一個(gè)扎實(shí)的基礎(chǔ),我認(rèn)為一切高階技術(shù)對(duì)我來(lái)講都是過(guò)眼云煙,要成為一名及格的前端工程師,必...

    Meils 評(píng)論0 收藏0
  • JavaScript基礎(chǔ)知識(shí)

    摘要:用和包裹的內(nèi)容,稱為字符串。關(guān)系運(yùn)算符用于進(jìn)行比較的運(yùn)算符。強(qiáng)制依賴于,非強(qiáng)制依賴于。使用場(chǎng)合全局環(huán)境構(gòu)造函數(shù)對(duì)象的方法閉包閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)。所有全局對(duì)象函數(shù)以及變量均自動(dòng)成為對(duì)象的成員。 1 什么是JavaScript JavaScript一種直譯式腳本語(yǔ)言,一種基于對(duì)象和事件驅(qū)動(dòng)并具有安全性的客戶端腳本語(yǔ)言;也是一種廣泛應(yīng)用客戶端web開發(fā)的腳本語(yǔ)言。...

    Code4App 評(píng)論0 收藏0
  • 數(shù)組 - Javascript語(yǔ)法基礎(chǔ) - Javascript核心

    摘要:數(shù)組創(chuàng)建數(shù)組數(shù)組字面量使用構(gòu)造函數(shù)數(shù)組本質(zhì)上是所以要判斷是不是數(shù)組,需要通過(guò)判斷。數(shù)組長(zhǎng)度使用屬性獲取元素的個(gè)數(shù)。例如函數(shù)的對(duì)象就是這樣 原文: http://pij.robinqu.me/JavaScript_Core/JavaScript_Basics/Array.html 源代碼: https://github.com/RobinQu/Programing-In-...

    molyzzx 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<