作用域及閉包

1、兩個不同的函數(shù)各自申明了同一個變量嘶居,那么該變量只在各自的函數(shù)體內(nèi)起作用。
2、由于JavaScript的函數(shù)可以嵌套奖地,此時,內(nèi)部函數(shù)可以訪問外部函數(shù)定義的變量羹铅,反過來則不行香缺。
3、變量提升苫幢,
4访诱、全局作用域( window )
5、局部作用域:for if else 不能創(chuàng)造作用域
eg:for循環(huán)中用var定義的i韩肝,在for循環(huán)外部触菜,依舊能夠訪問到;相反哀峻,用 let 可以實(shí)現(xiàn)塊級作用域涡相。
6、ES6中剩蟀,表示常量的const也有塊級作用域
7催蝗、ES6解構(gòu):一個對象中取出若干屬性,一個數(shù)組中取出若干到元素
8育特、map():給數(shù)組的每一項(xiàng)進(jìn)行相同的操作丙号,得到一個新數(shù)組,是操作后得到的數(shù)組

          把Array的所有數(shù)字轉(zhuǎn)為字符串:
          var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
          arr.map(String);   // ['1', '2', '3', '4', '5', '6', '7', '8', '9']

·
字符串轉(zhuǎn)成數(shù)字為什么不行缰冤?


        var arr = ['1', '2', '3'];
        arr.map(parseInt);  //  1,NaN,NaN

        正確解析:
        由于map()接收的回調(diào)函數(shù)可以有3個參數(shù):callback(currentValue, index, array)犬缨,通常我們僅需要第一個參數(shù),而忽略了傳入的后面兩個參數(shù)棉浸。不幸的是怀薛,parseInt(string, radix)沒有忽略第二個參數(shù),導(dǎo)致實(shí)際執(zhí)行的函數(shù)分別是:
        parseInt('0', 0); // 0, 按十進(jìn)制轉(zhuǎn)換
        parseInt('1', 1); // NaN, 沒有一進(jìn)制
        parseInt('2', 2); // NaN, 按二進(jìn)制轉(zhuǎn)換不允許出現(xiàn)2
        可以改為:
        arr.map(Number);
        因?yàn)镹umber(value)函數(shù)僅接收一個參數(shù)涮拗。

        

9乾戏、reduce() : 把一個函數(shù)作用在一個Array的 [ x1, x2, x3... ] 上,這個函數(shù)必須接收兩個參數(shù)三热,reduce()把結(jié)果繼續(xù)和序列的下一個元素做累積計算

       a ) 對一個Array求和鼓择,就可以用reduce實(shí)現(xiàn):
       var arr = [1, 3, 5, 7, 9];
        arr.reduce(function (x, y) {
              return x + y;
        }); // 25

        b) 要把[1, 3, 5, 7, 9]變換成整數(shù)13579,reduce()也能派上用場:
        var arr = [1, 3, 5, 7, 9];
        arr.reduce(function (x, y) {
            return x * 10 + y;
        }); // 13579
 
        

10就漾、filter() : 從數(shù)組中呐能,篩選出想要的數(shù)據(jù),返回組成新的數(shù)組

        a)   數(shù)組去重
        arr.filter( function(element,index,self){
                return  self.indexOf(element) === index
        } )

11、sort():默認(rèn)轉(zhuǎn)成字符串后摆出,再進(jìn)行比較朗徊。導(dǎo)致 [1,2,10,20] 的排序結(jié)果為【1,10偎漫,2爷恳,20】,解決如下:

      arr.sort(function(x,y){
            if(x>y){
                return 1;
            }  else  if(x==y){
                return 0;
            }  else{
                return -1;
            }  
      })

并且象踊,sort() 會改變原數(shù)組

12温亲、閉包實(shí)例1:

 function outter(){
      var sky="blue";
      function inner(){
            console.log(sky);
      }
     return inner;
}
var result=outter();
result();    //"blue"

閉包:

閉包是指有權(quán)訪問另一個函數(shù)作用域中變量的函數(shù),創(chuàng)建閉包的最常見的方式就是在一個函數(shù)內(nèi)創(chuàng)建另一個函數(shù)杯矩,通過另一個函數(shù)訪問這個函數(shù)的局部變量,利用閉包可以突破作用鏈域栈虚,將函數(shù)內(nèi)部的變量和方法傳遞到外部。

閉包的特性:

1.函數(shù)內(nèi)再嵌套函數(shù)
2.內(nèi)部函數(shù)可以引用外層的參數(shù)和變量
3.參數(shù)和變量不會被垃圾回收機(jī)制回收
上面代碼就包含一個簡單的閉包:outter函數(shù)的返回值是一個函數(shù)史隆,即inner魂务。inner在outter內(nèi)部,理所當(dāng)然能訪問到局部變量sky泌射,但當(dāng)inner作為outter的返回值賦給outter外的全局變量時粘姜,神奇的事情發(fā)生了:在全局作用域中訪問到了sky,這就是閉包熔酷。

原理:

每個函數(shù)都有自己的執(zhí)行環(huán)境相艇,當(dāng)一個函數(shù)被執(zhí)行時,它的執(zhí)行環(huán)境就會被推入環(huán)境棧纯陨,其活動對象(存儲環(huán)境中定義的變量及函數(shù))加入作用域鏈中坛芽,一旦函數(shù)執(zhí)行完,棧將其環(huán)境彈出翼抠,活動對象被銷毀咙轩。·

對于上面的例子來說,outter執(zhí)行完之后將返回inner給了result阴颖,outter的執(zhí)行環(huán)境從環(huán)境棧彈出活喊,控制權(quán)交給全局環(huán)境,outter的活動對象理應(yīng)被銷毀量愧。但此時inner已經(jīng)存儲在全局活動對象中了钾菊,同時inner需要訪問sky,所以outter的活動對象沒有被銷毀偎肃,即使result執(zhí)行完畢煞烫,outter的活動對象依然存在于作用域鏈中,只有當(dāng)result被銷毀

閉包優(yōu)點(diǎn):

能在一個函數(shù)外訪問函數(shù)中的局部變量累颂,把這些變量用閉包的形式放在函數(shù)中便能避免全局作用域污染滞详。

閉包缺點(diǎn):

  • 閉包將函數(shù)的活動對象維持在內(nèi)存中凛俱,過度使用閉包會導(dǎo)致內(nèi)存占用過多;
  • 閉包只能取得外部函數(shù)中任何變量的最后一個值料饥,在使用循環(huán)且返回的函數(shù)中帶有循環(huán)變量時會得到錯誤結(jié)果蒲犬;
  • 當(dāng)返回的函數(shù)為匿名函數(shù)時,注意匿名函數(shù)中的this指的是window對象岸啡。
    function counter () {  
        var n = 0;  
        return {  
            count:function(){return n++;},  
            reset:function(){n = 0;}  
        }  
     }  
    var c = counter();
    var d = counter();  // 每創(chuàng)建一個實(shí)例原叮,他們的n都互不影響
    c.count()    //0  
    d.count()    //0  
    c.reset()      //reset()和count()共享  
    d.count()     //1  
    c.count()     //0  
<script>
    function A(){
        var x = 1;
        return function(){
            x++;
            console.log(x);
        }
    }
    var m1 = A();//第一次執(zhí)行A函數(shù)
    m1();//2
    m1();//3
    var m2 = A();//第二次執(zhí)行A函數(shù)
    m2();//2
    m1();//4
</script>

常見的內(nèi)存泄漏方式:

1、意外的全局變量

a)函數(shù)里未用var/let來聲明變量
b)在函數(shù)中通過this賦予變量巡蘸,在函數(shù)中篇裁,this指向window

2、定時器setTimeout setInterval以及回調(diào)函數(shù)

當(dāng)不需要setInterval或者setTimeout時赡若,定時器沒有被clear,定時器的回調(diào)函數(shù)以及內(nèi)部依賴的變量都不能被回收团甲,造成內(nèi)存泄漏逾冬。
比如:vue使用了定時器,需要在beforeDestroy 中做對應(yīng)銷毀處理躺苦。js也是一樣的身腻。

3、閉包(在全局作用域上保留著閉包局部變量的引用)
4匹厘、循環(huán)引用的變量或者對象
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘀趟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子愈诚,更是在濱河造成了極大的恐慌她按,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炕柔,死亡現(xiàn)場離奇詭異酌泰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)匕累,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門陵刹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欢嘿,你說我怎么就攤上這事衰琐。” “怎么了炼蹦?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵羡宙,是天一觀的道長。 經(jīng)常有香客問我掐隐,道長辛辨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮斗搞,結(jié)果婚禮上指攒,老公的妹妹穿的比我還像新娘。我一直安慰自己僻焚,他們只是感情好允悦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虑啤,像睡著了一般隙弛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狞山,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天全闷,我揣著相機(jī)與錄音,去河邊找鬼萍启。 笑死总珠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勘纯。 我是一名探鬼主播局服,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驳遵!你這毒婦竟也來了淫奔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤堤结,失蹤者是張志新(化名)和其女友劉穎唆迁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竞穷,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡媒惕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了来庭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妒蔚。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖月弛,靈堂內(nèi)的尸體忽然破棺而出肴盏,到底是詐尸還是另有隱情,我是刑警寧澤帽衙,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布菜皂,位于F島的核電站,受9級特大地震影響厉萝,放射性物質(zhì)發(fā)生泄漏恍飘。R本人自食惡果不足惜榨崩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望章母。 院中可真熱鬧母蛛,春花似錦、人聲如沸乳怎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚪缀。三九已至秫逝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間询枚,已是汗流浹背违帆。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留金蜀,地道東北人刷后。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像廉油,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苗傅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1抒线、引言 最近在刷leetcode題的時候,遇到一個求最長回文子串的題目渣慕,于是嘶炭,我寫了如下的代碼: 哎呀,寫了兩個...
    文哥的學(xué)習(xí)日記閱讀 14,299評論 6 32
  • 這次主要用例子解釋一下什么是作用域逊桦,什么是自由變量眨猎,什么是閉包,因?yàn)橛靡痪湓捀爬▽?shí)在是概括不出來强经,歡迎有大神可以一...
    石燕平_Leo閱讀 792評論 2 2
  • still, 你的不知道的js里講的很清楚了 如果查找的目的是對變量進(jìn)行賦值睡陪,則進(jìn)行LHS查詢;如果查找的目的是獲...
    葉子是會飛翔的翅膀閱讀 222評論 0 0
  • 作用域:1. 全局 作用域鏈:函數(shù)嵌套 閉包(Closure)函數(shù)嵌套匿情,在內(nèi)嵌函數(shù)中使用到外部函數(shù)的局部變量(即內(nèi)...
    dwy_interesting閱讀 171評論 0 0
  • 來談一下我的舍友小蛇吧兰迫。 小蛇是我大學(xué)四年的舍友,畢業(yè)之后也一直和她合租著房子炬称,我們倆也算有緣吧汁果,都是一個星座的,...
    不安分的菠蘿閱讀 163評論 0 0