Js封裝(即面向對象,不懂面向對象思想的同學不用向下看了)
js並不是一種面向對向的語言, 沒有提供對類的支持, 因此我們不能像在傳統的語言里那樣 用class來定義類, 但可以利用js的閉包封裝機制來實現js類, 封裝一個簡的
CharlesObj類.
function
CharlesObj() {
this.show = function(){alert(" CharlesObj show");};
this.init = function(){alert(" CharlesObj init");};
}
這個類里定義了兩個方法:show和init, 需要注意的是這里用到了this來聲明, 而不是var, 因為用var是用來定義私有方法的.
這個類里定義了兩個方法:show和init, 需要注意的是這里用到了this來聲明, 而不是var, 因為用var是用來定義私有方法的.
以下是對封裝的js類調用
var
cj =
new
CharlesObj(
);
cj.show
();
cj.init
();
這樣看來貌似封裝也不過如此,但如果我們有在網上找過Js代碼或者插件的話,經常會在代碼中看到類似這樣的代碼
(function(){
alert("...");
......
});
這樣的代碼其實就是所謂的閉包了,那么閉包在js中究竟起個什么作用?
我們如果問朋友或查資料通常得到的都是:閉包就是指變量在某個作用域上的值,這個變量只在這個作用域上起作用。閉包對變量而言,閉包指某個作用域。
一直很奇怪,如果是作用域的問題,完全可以用全局變量和局部變量來解決,為何還專門要搞個閉包出來,這不是閑的蛋疼;
直到前面有次調用百度地圖api的實現多覆蓋物標注時遇到個問題:
百度地圖api提供地圖標注功能,但並沒有提供根據賦值ID或某唯一標識來區分不同的覆蓋物,這就存在一個問題,我們不可能永遠在地圖上只標一個點,當時第一個想法是創建多個全局變量保存覆蓋物對象,這個想法一冒出就覺的要這么干,就太2b了點,繼續想別的方法,后來有人說用閉包,在閉包里面直接綁定事件,雖然不怎么理解,但依葫蘆畫瓢先搞定功能再說,結果當然是目的達到了,但還是不清楚為啥,閉包就行;今天想將js提煉下,前提自然得將這些東東在了解下,不然提煉出來的還是這種垃圾代碼!所謂磨刀不誤砍柴工,終於讓我看到,原來閉包中的值會一直存在於內存中,還是來個demo說明下問題:
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
在這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,第二次的值是1000。這證明了,函數f1中的局部變量n一直保存在內存中,並沒有在f1調用后被自動清除。
既然了解了閉包值會一直存在於內存中,那么自然我們不能濫用閉包,否則會大大增加內存的消耗
既然了解了閉包值會一直存在於內存中,那么自然我們不能濫用閉包,否則會大大增加內存的消耗
本文仍是在本人似懂非懂下寫的,主要想看下自己究竟是否真正理解,許多東西我們聽上去挺簡單,但往往我們很久之后還是不會,原因很大一部分是因為我們的動手能力太差,此句僅說給自己聽