JavaScript this 深入理解

作者:纸飞机

时间:2026-10-23

浏览:326

本文深入解析 JavaScript 中 this 关键字的核心机制,区分函数调用者与所有者概念。通过代码示例说明顶层调用与对象方法调用时 this 指向的差异,并介绍利用 apply 和 call 改变函数所有者(this 绑定)的具体用法与参数传递区别。

文章目录

JavaScript this 核心机制解析

近期研读 prototype、Ext core 等 JavaScript 库源码,发现其大量运用此概念。直至阅读《JavaScript 王者归来》方对 this 有深刻理解。总结如下: 1. 函数调用者与所有者 JavaScript 函数存在调用者与所有者概念。调用者指调用函数的对象,通常指向调用当前函数的函数引用;顶层调用时 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");

---------

改变 this 指向的方法

初始调用 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 指向)的方法是将函数引用赋值给某个对象的属性。


apply 与 call 的使用差异

此外,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用法小结


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

JavaScript this 深入理解 https://www.jb51.net/article/19425.htm

JAVASCRIPT THIS详解 面向对象 https://www.jb51.net/article/17584.htm

Javascript this指针 https://www.jb51.net/article/19434.htm

JavaScript中this关键字使用方法详解 https://www.jb51.net/article/7954.htm

Javascript this关键字使用分析 https://www.jb51.net/article/16235.htm

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章