JavaScript 核心概念解析:this 指向、原型链与闭包机制

作者:异步漫步

时间:2026-10-30

浏览:323

本文深入解析 JavaScript 三大核心概念。首先阐述原型链通过 [[Prototype]] 属性连接对象至 Object.prototype 的继承机制;其次详解 this 在 new、call/apply/bind、上下文调用及默认情况下的四种绑定规则;最后解析闭包如何持有外部函数作用域引用以防止垃圾回收,确保变量持久可用。

文章目录

原型链机制解析

原型链

JavaScript 中所有对象均基于 Object.prototype,该对象被视为 JavaScript 的根对象。定义在 Object.prototype 中的方法可被其他对象访问,尽管这些方法可能被重写。例如,直接在 Object.prototype 上调用的原始 toString() 方法,会返回参数对象的内置属性 [[class]] 的值,该返回值是一个字符串,如 '[Object String]'。

理解原型链机制的关键在于根本原因:JavaScript 中的对象拥有一个内置属性 [[Prototype]]。该属性与非标准的 __proto__ 属性作用基本等价,且 __proto__ 已在 ES6 中纳入标准,但内置属性 [[Prototype]] 无法被直接访问。对象之间通过 [[Prototype]] 相互关联形成原型链,其顶层为根对象 Object.prototype,而 Object.prototype 的原型指向 null,即 Object.prototype.__proto__ === null。

例如:

在访问对象属性时(如 obj.a),引擎首先查找对象自身属性;若未找到,则沿着内置属性 [[Prototype]] 引用的对象继续查找;若仍未找到,则继续向上层对象的 [[Prototype]] 查找,直至到达根对象 Object.prototype。若全程未找到,则返回 undefined。

this 指向规则详解

this

理解 this 的第一步是明确:this 既不指向函数自身,也不指向函数的词法作用域。

this 是在运行时进行绑定的,而非编写时绑定,其上下文完全取决于函数调用时的具体条件。

this 的绑定与函数声明的位置无关,仅取决于函数的调用位置和调用方式。

this 的绑定规则共有 4 点,需按优先级 1 到 4 进行判断。

1. 若由 new 调用?this 绑定到新创建的空对象。

2. 若由 call、apply 或 bind 调用?this 绑定到指定的参数对象,例如 foo.call(obj)。

3. 若由上下文对象调用?this 绑定到该上下文对象,例如 obj.foo()。

4. 默认情况下,this 绑定到全局对象(如 foo());在严格模式下,this 绑定到 undefined。

闭包原理与应用

闭包


function foo(){
var a = 2;
function bar(){}
return bar;
}
var a = foo();
a(); 

闭包并非指函数 bar 或变量 a,而是一个被内部函数 bar 持有的引用。该引用指向外部函数 foo 的整个作用域,使得即使外部函数 foo() 执行完毕,该作用域也不会被垃圾回收器回收。换言之,外部函数 foo 的作用域即为闭包本身。无论通过何种手段(直接或间接)将内部函数传递到其所在的词法作用域之外,它都会持有对原始定义作用域的引用,无论在何处执行该函数,都会使用闭包。


var fn; //间接传递函数
function foo(){
var a = 2;
function baz(){
console.log(a);
}
fn = baz;
}
function bar(){ fn();}
foo();
bar(); function foo(){
var a = 2;
function baz(){
console.log(a);
}
bar(baz);
}
function bar(fn){ fn(); }

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章