閉包和引用,this引用的簡單介紹……
<script type="text/javascript">
var a = "1";
var b = a;
b = "2";
alert(a);
//這里a是非對象,所以b = a 的時候,是把a引用的值拷貝了一份,然后直接給b,所以修改b的時候當然不會改變a
var a = {};
a.name = "w";
var b = a;
b.name = "c";
alert(a.name);
/*
這里a是對象,所以b = a 的時候,是把a的引用copy了一份,然后給b,又因為修改b.name
是通過b引用的對象,修改對象的成員,所以修改b.name的時候a也被修改了。。因為它們的引用相同即某無知的對象。。
但是如果你直接b = xxxx,這樣就不會影響到a的引用對象,因為b的引用和a是一樣的,你只是把b的引用改變了,
而不是通過b引用的對象去修改里面的成員。。。所以a的引用對象不會受到影響。。。
即
*/
b = "wc";
alert(a);
/*
下面介紹this的引用,this的引用是執行的那個函數 . 之前的對象比如。。。
wc.func();
這樣this的引用就指向wc
如果是
func();
這種形式都可以認為是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.func的那個函數的引用copy了一份給b.func
b.func(); //b
var c = a.func;
c(); //window
//關于引用的介紹到此:D
</script>
閉包:
閉包其實就是執行一個函數后,資源不會釋放。。。
一般是函數里提供了一些資源,當函數執行完畢后,這些資源外面還會用到(函數之外存在引用)
嗯,我堅信code最有說服力。。。:D
<script type="text/javascript">
var a = function (i) {
return function () {
alert(i);
};
};
var b = a("內容"); //這里i變量被保留了所以產生了閉包;
alert(b);
b(); //內容
//下面介紹下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方法,就是相當于Array.call(null, arguments),注意arguments對象不是數組對象,只不過它有length屬性和0-n屬性而已。。。
又因為它有這些屬性,并且還可寫。。。所以可以用Array.call方法來改成數組
其實就是等同于
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();
這句就是把arguments轉換成數組給a.
var wc = this;
因為這個是原型-prototype(關于原型后面會有文章介紹)下的方法,所以,所有函數對象都會被繼承。。。
可以測試下面代碼:
*/
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>
下面展示一個很簡單的閉包實例:
(以AJAX取的JSON數據后,生成表格,并在相應的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 );
posted on 2007-12-23 23:57
-274°C 閱讀(773)
評論(3) 編輯 收藏 所屬分類:
web前端