闭包和引用,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 阅读(766) 评论(3)  编辑  收藏 所属分类: web前端


FeedBack:
# re: JAVASCRIPT 与闭包[未登录]
2009-07-17 13:23 | test
<script type="text/javascript">


var a = function(_i)
{
return function()
{
alert(_i);
}

};

a(10)();

var b = function()
{
return function(_i)
{
alert(_i);
}

};

b()(10);

</script>  回复  更多评论
  
# re: JAVASCRIPT 与闭包
2009-07-23 09:35 | java-he
循环给元素添加事件的方法除了上面的闭包,还有一种巧妙的方法。比如
for(var i=1; i < 4; i++){
var id = document.getElementById("a" + i);
id.i=i;//这个i有了根
id.onclick=function(){
alert(this.i)
};
};
  回复  更多评论
  
# re: JAVASCRIPT 与闭包
2009-10-27 01:59 | -274°C
根据《JavaScript 内存泄露》
(http://www.blogjava.net/JAVA-HE/archive/2009/10/27/299856.html)
这里总结,上面方法是有内存泄露的。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

常用链接

留言簿(21)

随笔分类(265)

随笔档案(242)

相册

JAVA网站

关注的Blog

搜索

  •  

积分与排名

  • 积分 - 909068
  • 排名 - 40

最新评论