手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >JavaScript this 深入理解
JavaScript this 深入理解
摘要:最近一段时间看了很多JavaScript的库源码,如prototype,Extcore等。这些库中大量应用到了这一概念。直到昨天翻了一下《J...

最近一段时间看了很多JavaScript 的库源码, 如 prototype, Ext core 等。这些库中大量应用到了这一概念。直到昨天翻了一下《JavaScript王者归来》这本书才算对this有一个深刻的理解。

大至归结一下:

1. 函数调用者与所有者

JavaScript 中函数(function) 存在调用者 与 所有者这两个概念,调用者是指调用函数的对象,通常是一个指向调用了当前函数的函数的引用,如果是顶层调用,那么caller=null, 大部分浏览器的JavaScript实现 可以用 caller 这个属性获得(这不是 ECMAScript 规范的一部分,所有还是慎用)。 从以下的代码能够很好的理解这点:

复制代码 代码如下:

function a(){

alert('fun a caller=' + a.caller);

}

function b(){

a();

}

a();

b();

-----------

运行结果可以看到两个对话框:

1.

fun a caller=null;

2.

fun a caller=function b(){

a();

}

--------------------------

而对于所有者,则是指调用函数的对象(一个动态的概念), 在函数体中的this就是指向了函数的所有者。在这里的this 与 Java 以及 C++ 中的 this指针是完全不同的两个概念,很多人忽略了这一点,这也是导致 JavaScript中的this无法很好理解的原因之一。看看以下的例子:

复制代码 代码如下:

var oa = {

x:1,

y:2

}

var ob = {

x:11,

y:12

}

function a(w){

alert(w + "=" + this.x + "," + this.y)

}

a("?");

oa.fun = a;

oa.fun("a");

ob.fun = a;

ob.fun("b");

---------

一开始的调用 a() 这时未指定所有者,一般这种情况 this 是指向浏览器的顶层元素 window 的, 而window中未定义x 与 y 属性。

所以结果显示为: ?=undefined,undefined

oa.fun = a; oa.fun("a"); 将函数引用赋值给对像a的属性fun, 这时再调用函数的所有者变成了a, 则结果显示为:a=1,2

同理 ob.fun("b")则显示:b=11,12。

在JavaScript中要改变一个函数的所有者(this)的方法就是将函数引用赋值给一个对象的属性。

同是在Function对象中也提供了两个原型函数可以实现这一功能: apply, call, 这两个函数的第一个参数就是要指定的所有者对象,它们间的唯一区别就是apply将其后的要传递给函数的形参封装到数组中,或者直接用 arguments对象。而call则直接将形参跟在其后。

因此上面的 oa.fun=a; oa.fun("a") 可以改写成 a.apply(oa, ["a"]) 或 a.call(oa, "a");

ob.fun=b; ob.fun("b") 可以改写成 a.apply(ob, ["b"]) 或 b.call(ob, "b");

知道了以上这此,对于 this 的作用域及其使用就很好理解了。

下面是一些参考文档

javascript this用法小结

http://www.jb51.net/article/16863.htm

JavaScript this 深入理解

http://www.jb51.net/article/19425.htm

JAVASCRIPT THIS详解 面向对象

http://www.jb51.net/article/17584.htm

Javascript this指针

http://www.jb51.net/article/19434.htm

JavaScript中this关键字使用方法详解

http://www.jb51.net/article/7954.htm

Javascript this关键字使用分析

http://www.jb51.net/article/16235.htm

【JavaScript this 深入理解】相关文章:

Web开发必知Javascript技巧大全

JavaScript中的replace()方法使用详解

JavaScript基本数据结构

Javascript随机显示图片的源代码

Javascript节点关系实例分析

JavaScript中的异常处理方法介绍

纯javascript制作日历控件

JavaScript中的setUTCDate()方法使用详解

JavaScript操作Cookie方法实例分析

JavaScript使用addEventListener添加事件监听用法实例

精品推荐
分类导航