国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Javascript的獨特的概念之閉包

瀏覽:28日期:2022-06-03 09:49:06
目錄
  • Javascript閉包簡介:
  • 為什么是閉包:
  • 總結

Javascript閉包簡介:

Javascript語言中,有一個獨特的概念:閉包(closure),這在類似C++,Java等編程語言中沒有這個概念。很多高級應用都要依靠閉包實現。

為什么是閉包:

或者說,為什么需要閉包,閉包的作用到底是什么?要理解這個概念,首先要理解Javascript中的作用域。

閉包的作用域:

和Java,C/C++等高級編程語言一樣,Javascript也有作用域這個概念。但是,相比而言,它們有很大的區別。

1). 變量的標識:Java,C/C++等編程語言是強類型語言,即變量的聲明需要用類型來標識(無論是普通類型,還是自定義類型)。

而Javascript語言是弱類型語言,即不需要用具體的類型來標識變量(例如,只需要用var/let,或者都不需要用它們來標識)。

2). 變量的作用域:

Javascript:函數內部可以直接讀取全局變量;在函數外部無法訪問函數內的局部變量。

函數內部聲明的變量,一定要用var來標識;如果一個變量沒有標識,則這個變量實際上是一個全局變量。

例如:

var x=10;
  function fun1(){
       var y = 20;
       z = 30;
    console.log(x); //success
  }
   fun1()
    //console.log(y);  //error:Uncaught ReferenceError: y is not defined。 
//分析:y是fun1的內部變量,在函數外部方法fun1的內部變量y
    console.log(z);  //success:z實際上是全局變量

運行結果:

10

30

10 

閉包的概念以及使用:

可以將閉包理解為: 一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。

例如:

function fun2(){
   var x=100;
   function fun3(){
     console.log(x); 
   }
   return fun3;
 }
 var result=fun2();
 result(); //success,輸出100

這就是一個閉包的例子。fun2函數的返回值賦給result,再執行result(),從而訪問到fun2中的fun3函數的代碼。 

有時,我們需要能夠訪問到函數內的局部變量,這時,就需要用閉包來實現。例如,

function fun4(){
    var x=100;
       iAddOne = function(){
 x=x*x;
       }
    function fun_41(){
      console.log(x);
    }
    return fun_41;
  }
  var res=fun4();
    res(); // 10
    iAddOne();
    res(); // 11

運行結果:

100

10000

可見,這里,閉包是一個函數。

閉包的另外一個作用是:

讓閉包表達式的變量始終保存在內存中。因為“變量也是該表達式的一部分”,所以,在函數外部擁有來這個閉包表達式,就相當于擁有來表達式中的變量。

只有在”擁有表達式的函數“的生命周期結束,閉包的生命周期也隨之結束。

閉包還可以凈化命名空間。

Javascript的一大糟粕就是命名空間沖突。

在C++中,使用using namespace 來進行命名空間的聲明和使用;

在java語言中,用import packagename來進行區別。

而在Javascript中,卻沒有這樣的機制。這樣,很容易引起類似“同名方法的多處定義和引用”而帶來的問題。

因此,有了閉包,在某種程度上,可以減緩這類問題。即內部函數名稱相同,但是外部函數可以不同名字就行。

例如:

function fun_test() {
   function fun1(){
   var x=100;
   function fun_common(){
     console.log(x); 
   }
   return fun_common;
 }
function fun2(){
   var y=200;
   function fun_common(){
     console.log(y); 
   }
   return fun_common;
 }
  var result1=fun1();
  result1(); //success,輸出100
  var result2=fun2();
  result2(); //success,輸出200
}

運行結果:

100

200
 

可見, fun_common分別在fun1和fun2函數中有定義,在fun_test中可以正確訪問到它們。

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注的更多內容!  

vv

標簽: CSS HTML
相關文章:
主站蜘蛛池模板: 国产亚洲精品国产第一 | 日韩成人免费在线 | 欧美在线一级毛片观看 | 在线视频一区二区三区四区 | 欧美日韩一区二区三区视频播 | 精品一区二区三区亚洲 | 亚洲 欧美 国产 中文 | 日日操干 | 国产成人精品视频播放 | 日韩午夜在线 | 最新毛片久热97免费精品视频 | 在线看a级片 | 成人国产在线24小时播放视频 | 久久香蕉国产观看猫咪3atv | 一级绝黄| 九九精品视频在线播放 | 99久久精品免费精品国产 | 成人国产视频在线观看 | 国产成人精品一区二区秒拍 | 国产午夜三级 | 一本久综合久久爱 | 久久九九免费视频 | 亚洲日本va午夜中文字幕 | 2021国产精品一区二区在线 | 久久性妇女精品免费 | 亚洲精品亚洲人成在线 | 成年人国产视频 | 亚洲香蕉影院 | 在线a视频网站 | 91亚洲精品一区二区在线观看 | 久香草视频在线观看免费 | 理论片我不卡在线观看 | 国产高清一级毛片在线不卡 | 国产区一区 | 国产成人精品一区二区视频 | 欧美成人xxxx | 久久久网久久久久合久久久久 | 豆国产97在线 | 亚洲 | 日本免费www| 成熟女人免费一级毛片 | 欧美久色 |