深入理解JavaScript中的this与绑定规则
需积分: 7 118 浏览量
更新于2024-08-30
收藏 94KB PDF 举报
"这篇文档详细解析了JavaScript中的`this`关键字,强调了`this`的绑定不是在编写时决定,而是在运行时根据函数调用的方式动态确定。文档概述了四种`this`的绑定规则:默认绑定(区分严格模式和非严格模式)、隐式绑定、显式绑定以及`new`绑定。"
JavaScript中的`this`关键字是个关键概念,它在不同的上下文中可以有不同的指向。首先,`this`的绑定并不依赖于函数声明的位置,而是由函数调用时的具体情境决定。对于初学者来说,`this`的指向可能经常引发困惑,因为它不总是指代函数本身,而是根据调用方式而变化。
1. 默认绑定:
- 在非严格模式下,当函数独立调用(没有特定上下文)时,`this`通常绑定到全局对象,即在浏览器环境中是`window`对象。
- 在严格模式下,`this`不再默认绑定到全局对象,而是被绑定到`undefined`。
例如:
```javascript
function foo() {
console.log(this.a);
}
var a = 2;
foo(); // 2 (非严格模式)
function foo() {
"use strict";
console.log(this); // undefined
console.log(this.a); // 抛出错误:Cannot read property 'a' of undefined
}
var a = 2;
foo(); // 严格模式
```
2. 隐式绑定:
- 当函数通过某个对象的属性来调用时,`this`会绑定到那个对象。但要注意,这种绑定与函数的定义位置无关,只看调用方式。
如:
```javascript
var obj = {
name: "heyushuo",
age: 25,
fn: function() {
function sayName() {
console.log(this); // window,因为sayName是独立调用,不是通过obj调用
console.log(this.age); // undefined
}
sayName();
}
};
obj.fn(); // 虽然sayName在obj.fn内部,但依然是独立调用,this不指向obj
```
3. 显式绑定:
- 使用`.call()`、`.apply()`或`.bind()`方法可以强制设置`this`的值,使其不再依赖调用方式。
例如:
```javascript
var obj = {
a: 2,
foo: function() {
console.log(this.a);
}
};
var bar = obj.foo; // 函数别名
bar(); // 2
bar.call({ a: 3 }); // 通过call显式改变this,输出3
```
4. `new`绑定:
- 当使用`new`关键字创建一个新对象时,`this`会被绑定到这个新创建的对象。
例如:
```javascript
function Person(name) {
this.name = name;
}
var person1 = new Person("Alice");
console.log(person1.name); // Alice
```
了解这些绑定规则后,开发者可以更准确地预测和控制JavaScript中`this`的行为,避免常见的陷阱和错误。在实际开发中,理解`this`的工作原理对于编写可维护和可预测的代码至关重要。
2010-07-24 上传
2020-11-24 上传
2021-01-19 上传
2020-10-15 上传
2020-10-20 上传
2020-12-11 上传
2020-12-04 上传
2020-11-21 上传
2020-10-20 上传
weixin_38722329
- 粉丝: 12
- 资源: 960
最新资源
- JHU荣誉单变量微积分课程教案介绍
- Naruto爱好者必备CLI测试应用
- Android应用显示Ignaz-Taschner-Gymnasium取消课程概览
- ASP学生信息档案管理系统毕业设计及完整源码
- Java商城源码解析:酒店管理系统快速开发指南
- 构建可解析文本框:.NET 3.5中实现文本解析与验证
- Java语言打造任天堂红白机模拟器—nes4j解析
- 基于Hadoop和Hive的网络流量分析工具介绍
- Unity实现帝国象棋:从游戏到复刻
- WordPress文档嵌入插件:无需浏览器插件即可上传和显示文档
- Android开源项目精选:优秀项目篇
- 黑色设计商务酷站模板 - 网站构建新选择
- Rollup插件去除JS文件横幅:横扫许可证头
- AngularDart中Hammock服务的使用与REST API集成
- 开源AVR编程器:高效、低成本的微控制器编程解决方案
- Anya Keller 图片组合的开发部署记录