JavaScript this 指向问题

2017/07/28 | 2分钟阅读 | 更新于 2017/07/28

全局上下文

无论是否在严格模式下,在全局运行上下文中(在任何函数体外部)this都指代全局对象。

From: this - JavaScript | MDN

/* 浏览器环境中 ↓ */
console.log(this === window); // => true

在函数内部, this 指向与函数的调用方法有关

var o = {
  name: "o",
  fo: function () {
    console.info(this.name);
  },
};

o.fo(); // => 'o'
var o2 = {
  name: "o2",
};
o2.fo = o.fo;

o2.fo(); // => 'o2'
var name = "window";
var fo = o.fo;

fo(); // => 'window'
// OR
window.fo(); // => 'window'

严格模式下有所不同

在严格模式下,如果this未被执行的上下文环境定义,那么它将会默认为undefined。

this - JavaScript | MDN

var name = 'window'
var fn = () {
    console.log( this.name )
}
fn() // Uncaught TypeError: Cannot read property 'name' of undefined
window.fn() // => 'window'

构造函数中的 this 指向新的对象

function Book() {
  this.name = "book";
  this.fo = function () {
    console.info(this.name);
  };
}
var b = new Book();

b.fo(); // => 'book'

call 和 apply 以及 bind

fn.call 和 fn.apply 的第一个参数为 this 对象,指定调用该函数时的 this 指向

var example = {
    0: 'Hello',
    1: 'World',
    2: '!'
}
[].join.apply( example )
[].join.call( example )
/* 相当于 */
example.slice()
/* example 显然没有 .slice 方法,但是它作为一个类数组的对象,也可以被 slice 处理,只要改一下 slice 执行时的 this 对象 */

bind 可以将一个方法的 this 对象绑定为某个对象:

var $ = document.querySelector.bind(document);

箭头函数体内的 this 对象,就是定义时所在的对象

函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。

From: 函数的扩展 - ECMAScript6入门

var item = {
    name: 'item',
    fn () {
        console.log( this.name )
    },
    fo: () => {
        console.log( this.name )
    }
}
var copy = {
    name: 'copy'
    fn: item.fn,
    fo: item.fo
}
item.fn() // => 'item'
item.fo() // => 'item'
copy.fn() // => 'copy'
copy.fo() // => 'item'

其它情况

DOM事件处理函数中的 this

当函数被用作事件处理函数时,它的this指向触发事件的元素(一些浏览器在使用非addEventListener的函数动态添加监听函数时不遵守这个约定)。

内联事件处理函数中的 this

当代码被内联处理函数调用时,它的this指向监听器所在的DOM元素:

© 2026 香蕉引擎故障报告

🌱 Powered by Hugo with theme Dream.

关于

要怎么介绍自己呢,🤔。

很早以前是作为 Web 前端在学习的,但是工作第一年就成为了全干工程师。喜欢尝试各种东西,什么都会一点。

一直很喜欢 Ebiten 游戏引擎 ,特别简洁,用它做过一些小东西,可以查看这个分类 。另外特别推荐这个木鱼 ,是一个相对完整的小玩意儿,包含手搓的一个简单的 UI 框架;支持鼠标和键盘操作;有多语言和主题切换功能;同时支持 Web 端和客户端。它的源代码在 bin16/wooden-fish

主题

网站基于 Hugo,当前使用的是 hugo-theme-dream 主题的修改版 ,根据我的需要,做了一些对 PaperMod 的兼容。

我自己也写过主题 ,但是没有别人写的好看。

正在从我的笔记中往外搬运内容

等待更新:

  • 从《锈湖》中学了些什么东西
  • 我拿 React 写解谜游戏的经过
  • 基于 Pocketbase 的 Pocket Memos
  • 数独!