现在的位置: 首页 > 综合 > 正文

闭包和引用,this引用的详细介绍。。。

2013年10月03日 ⁄ 综合 ⁄ 共 1912字 ⁄ 字号 评论关闭

引用:JS对象付值传引用。。。其它直接传拷贝。。。
<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)));

这个$A(arguments)已前面经说过了。。。其它的都是数组的方法。。。如不明可以查手册。。。

至于apply和call方法具体内容可以参考apply和call的介绍那篇文章。。。

本篇文章暂时结束:D
*/
</script>

抱歉!评论已关闭.