A Roadmap
  • Introduction
  • Roadmap
  • Basics
    • Basic Terminal Usage
      • Shell
        • 基本
        • 变量
        • 传递参数
        • 运算符
        • 命令
        • 流程控制
        • 函数
        • 输入输出重定向
    • Character Encoding
      • 字符编码
    • Data Structures & algorithms
    • Network
      • TCP/IP
      • Http/Https
        • 浏览器缓存
        • Status Code
        • GET & POST
        • HTTPS 握手过程
        • HostOnly Cookie
      • CDN
        • CDN 工作原理
    • Version Control
      • git message format
      • git commands
    • Principles
    • Design Patterns
    • Others
      • JSON
      • 正则表达式
  • Front End
    • Web Standard
      • Html
      • CSS
        • font-face 小记
        • Grid 布局简易笔记
      • Javascript
        • Ajax
          • Fetch
          • XMLHttpRequest
        • DOM
          • Selection
          • 常用 DOM 操作
          • script 标签的几个属性
        • Ecmascript
          • this 关键字
          • Event Loop
          • 隐式转换
          • Date
        • Event
          • 模拟事件
          • Others
    • Development
      • Package Management
        • npm
      • Modulization
        • 模块化机制
        • webpack 打包解析
      • Architecture
      • Build Tools
        • 如何编写一个自定义的 eslint 规则?
      • Debug
        • 移动端调试 web
      • Pre/Post Processors
      • Test
        • Jest Snapshot 使用指南
      • Type Checkers
        • TS 中 enum 的编译结果
    • Libs & frameworks
    • Platforms
      • Browser
        • Basics
          • 从输入 URL 到页面加载完成都发生了什么事情?
          • HTML 加载的过程示意图
          • 为什么读取某些属性,也会导致回流?
          • Chrome 进程模型
        • PWA
        • Compatible
        • Cross Origin
        • Performance
          • 性能检测:performance 对象
          • 性能指标
        • Others
          • 移动端 web 开发笔记
      • Server
      • Desktop Applications
      • Mobile Applications
        • Flutter 在移动端和 Web 端的技术实现
  • Back End
    • outline
    • Languages
      • Node
        • Event Loop
        • NodeJS 中的进程与线程
        • NodeJS 中的 esModule 与 commonJS
  • Clients
    • outline
    • 安装 IPA 包
  • DevOps
    • Languages
    • OS Concepts
    • Servers & terminal
  • UI & UX
    • outline
  • Others
    • Posts
      • 使用 node 爬取数据并导出到 excel
      • antd 1.x datepicker 时区问题
      • babel-transform-runtime 踩坑记录
      • lodash 按需加载注意事项
      • 记一次项目迁移的踩坑记录
      • 时区与JS中的Date对象
      • 记一次 vue + ts 开发踩坑
    • Tools
      • 个人常用的工具分享
      • tmux 简要笔记
Powered by GitBook
On this page
  • 绑定规则
  • 默认绑定
  • 隐式绑定
  • 显式绑定
  • new 绑定
  • 特殊case
  • 被忽略的this
  • 间接引用
  • 箭头函数

Was this helpful?

  1. Front End
  2. Web Standard
  3. Javascript
  4. Ecmascript

this 关键字

this并不指向一个函数的词法作用域,而是在被调用时,由调用方式决定的一种绑定。

绑定规则

  • 确定绑定规则的一个很重要的点,就是要确定函数的调用栈。但是这不是this的决定性因素。

默认绑定

适用条件:在函数调用时,直接调用,没有其他任何修饰。

this指向:

  • 严格模式下,指向undefined

  • 非严格模式,指向全局对象(window或者是global)

指函数体内部有没有处于严格模式或非严格模式

function foo() {
    console.log(this);
}

foo(); // window

function bar() {
    "use strict";
    console.log(this);
}

bar(); // undefined

隐式绑定

适用条件:函数调用时存在一个上下文对象,即函数被一个对象包含或拥有。

this指向:指向绑定的对象

var a = 1;

var o = {
    a: 2,
    foo() {
        console.log(this.a);
    }
};

var bar = o.foo;

o.foo(); // 2

bar(); // 1

note:

  1. 这种隐式绑定只会在对象属性引用链的最后一层起作用。

  2. 隐式丢失 - 隐式绑定的函数,如果是直接调用时,会采用默认绑定。比如作为参数传递给另一个函数。

var a = 1;

var o = {
    a: 2,
    foo() {
        console.log(this.a);
    }
};

function bar(fn) {
    fn();
}

bar(o.foo); // 1

显式绑定

适用条件:

  • call

  • apply

  • bind

  • forEach, map等原生方法,支持传入第二个参数,用于改变第一个函数的context

this指向:指定的上下文

new 绑定

适用条件:通过new操作符进行构造函数调用时

this指向:通过new操作符调用的函数,创建的新对象上

特殊case

被忽略的this

如手动在显式绑定、硬绑定,传入context时传入undefined或null,此时等同于默认绑定

间接引用

注意函数的间接引用,比如赋值时的返回值。

var a = {
    foo() {
        console.log(this.bar)
    },
    bar: 1
};

var b = {
    bar: 2
};

(b.foo = a.foo)() // undefined

箭头函数

箭头函数的this指向词法作用域中被调用的this。并不是直接就跟词法作用域的this绑定了,具体还要考虑外层函数的调用规则。

function Bar() {
  this.a = 1;
  var obj = {
    func: () => {
      console.log(this.a);
    }
  };

  this.obj = obj;

  obj.func();
}

var bar = new Bar(); // 1
bar.obj.func(); // 1

function Foo() {
  this.a = 2;
  this.bar = new Bar();
  this.func = this.bar.obj.func;
}

var foo = new Foo(); // 1
foo.bar.obj.func(); // 1
foo.func(); // 1
PreviousEcmascriptNextEvent Loop

Last updated 3 years ago

Was this helpful?