liuqinh2s' blog

Do something cool!


  • 首页

  • 关于

  • 标签

  • 归档

  • 编程笔记

  • 新闻

  • 收藏

  • 思考

  • 前端面试

  • 力扣

  • 计算机科学

  • 量化交易

  • 英语

  • 导航

  • 阅读

  • 搜索

JavaScript 闭包

发表于 2022-07-14 | 更新于: 2025-08-21
字数统计: 1,148

闭包是干什么用的

本质上闭包就是为了拓展查找自由变量的范围

MDN 对闭包的定义为:

A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment)

一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。

1
2
3
4
5
6
7
8
9
function init() {
var name = 'Mozilla'; // name is a local variable created by init
function displayName() {
// displayName() is the inner function, a closure
console.log(name); // use variable declared in the parent function
}
displayName();
}
init();

name 是 displayName 函数所处环境中的变量,它们一起构成了闭包。而闭包的实现依赖于执行上下文中的作用域链。

上面这个例子有点平平无奇了,让我们看一个神奇一点的例子:

阅读全文 »

JavaScript执行上下文之变量对象

发表于 2022-07-13 | 更新于: 2025-08-21
字数统计: 932

执行上下文中包含哪些东西

对于每个执行上下文,都有三个重要属性:

  • 变量对象(Variable object,VO)
  • 作用域链(Scope chain)
  • this

本篇就来讲讲第一个变量对象

阅读全文 »

JavaScript执行上下文栈

发表于 2022-07-12 | 更新于: 2025-08-21
字数统计: 407

顺序执行?

代码示例 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var foo = function () {

console.log('foo1');

}

foo(); // foo1

var foo = function () {

console.log('foo2');

}

foo(); // foo2

代码示例 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function foo() {

console.log('foo1');

}

foo(); // foo2

function foo() {

console.log('foo2');

}

foo(); // foo2

第一个例子中用到了变量提升,第二个例子中用到了函数提升。JavaScript 引擎并非一行一行地分析和执行程序,而是一段一段地分析执行。当执行一段代码的时候,会进行一个“准备工作”。到底 JavaScript 引擎遇到一段怎样的代码时才会做“准备工作”呢?

阅读全文 »

JavaScript词法作用域

发表于 2022-07-11 | 更新于: 2025-08-21
字数统计: 905

有两种作用域:

  • 动态作用域
  • 静态作用域(也叫:词法作用域,lexical scoping)

JavaScript 采用的是词法作用域

阅读全文 »

JavaScript原型和原型链

发表于 2022-07-10 | 更新于: 2025-08-21
字数统计: 494

原型链是干什么用的

JavaScript 采用了原型和原型链来实现类和继承(就是查找属性用的)。

当 JavaScript 查找一个对象上的属性的时候,在该对象上找不到就会去它的原型链上查找(通过__proto__一层一层往上找)。比如:

1
2
3
4
function Foo() {}
var foo = new Foo();
Foo.prototype.a = 1;
console.log(foo.a); // 1

原型和原型链主要由三个指针实现:

  • prototype: 构造函数的prototype属性指向原型对象(这个原型对象一般就用构造函数.prototype表示)
  • __proto__: 实例对象的__proto__属性指向原型对象
  • constructor: 原型对象的constructor属性指向构造函数
  • 所有对象都基于Object,是因为所有原型对象的__proto__最终都指向Object.prototype,而Object.prototype的__proto__为 null
阅读全文 »
1…111213…22
liuqinh2s

liuqinh2s

107 日志
45 标签
RSS
GitHub Twitter
Links
  • liam
  • jiyanggg
  • 曾小乱 – 在描绘他的生活倒影
© 2025 liuqinh2s | Site words total count: 118.5k
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4