閉包和引用,this引用的簡單介紹……
<script type="text/javascript">
var a = "1";
var b = a;
b = "2";
alert(a);
//這里a是非對象,所以b = a 的時(shí)候,是把a(bǔ)引用的值拷貝了一份,然后直接給b,所以修改b的時(shí)候當(dāng)然不會改變a
var a = {};
a.name = "w";
var b = a;
b.name = "c";
alert(a.name);
/*
這里a是對象,所以b = a 的時(shí)候,是把a(bǔ)的引用copy了一份,然后給b,又因?yàn)樾薷腷.name
是通過b引用的對象,修改對象的成員,所以修改b.name的時(shí)候a也被修改了。。因?yàn)樗鼈兊囊孟嗤茨碂o知的對象。。
但是如果你直接b = xxxx,這樣就不會影響到a的引用對象,因?yàn)閎的引用和a是一樣的,你只是把b的引用改變了,
而不是通過b引用的對象去修改里面的成員。。。所以a的引用對象不會受到影響。。。
即
*/
b = "wc";
alert(a);
/*
下面介紹this的引用,this的引用是執(zhí)行的那個(gè)函數(shù) . 之前的對象比如。。。
wc.func();
這樣this的引用就指向wc
如果是
func();
這種形式都可以認(rèn)為是window.func();
所以它們的this的引用自然就是window;
下面小段code
*/
window.name = "window";
var a = {};
a.name = "a";
a.func = function () {
alert(this.name);
};
a.func(); //a
var b = {};
b.name = "b";
b.func = a.func; //這里是把a(bǔ).func的那個(gè)函數(shù)的引用copy了一份給b.func
b.func(); //b
var c = a.func;
c(); //window
//關(guān)于引用的介紹到此:D
</script>
閉包:
閉包其實(shí)就是執(zhí)行一個(gè)函數(shù)后,資源不會釋放。。。
一般是函數(shù)里提供了一些資源,當(dāng)函數(shù)執(zhí)行完畢后,這些資源外面還會用到(函數(shù)之外存在引用)
嗯,我堅(jiān)信code最有說服力。。。:D
<script type="text/javascript">
var a = function (i) {
return function () {
alert(i);
};
};
var b = a("內(nèi)容"); //這里i變量被保留了所以產(chǎn)生了閉包;
alert(b);
b(); //內(nèi)容
//下面介紹下prototype.js里的bind方法
Function.prototype.bind = function () {
//綁定事件
var wc = this, a = $A(arguments), o = a.shift();
return function () {
wc.apply(o, a.concat($A(arguments)));
};
};
/*
$A方法,就是相當(dāng)于Array.call(null, arguments),注意arguments對象不是數(shù)組對象,只不過它有l(wèi)ength屬性和0-n屬性而已。。。
又因?yàn)樗羞@些屬性,并且還可寫。。。所以可以用Array.call方法來改成數(shù)組
其實(shí)就是等同于
var $A = function () {
for (var a = [], i = 0 ; i < arguments.length ; i ++) a[i] = arguments[i];
return a;
};
var wc = this, a = $A(arguments), o = a.shift();
這句就是把a(bǔ)rguments轉(zhuǎn)換成數(shù)組給a.
var wc = this;
因?yàn)檫@個(gè)是原型-prototype(關(guān)于原型后面會有文章介紹)下的方法,所以,所有函數(shù)對象都會被繼承。。。
可以測試下面代碼:
*/
Function.prototype.wc = function () {
alert(this);
};
var f = function () {
alert(1);
};
f.wc(); //function () { alert(1); }
//即
Function.prototype.wc = function () {
var wc = this;
return function () {
alert(wc);
};
};
var n = f.wc();
n(); //function () { alert(1); }
/*
wc.apply(o, a.concat($A(arguments)));
*/
</script>
下面展示一個(gè)很簡單的閉包實(shí)例:
(以AJAX取的JSON數(shù)據(jù)后,生成表格,并在相應(yīng)的td位置上增加onclick事件)
var td_0 = document.createElement('td');
td_0.innerHTML = _json[i]["group_name"];
td_0.onclick = function (_i)
{
return function ()
{
getMember(_json[_i]["group_id"]);
};
}(i );