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