前言


javascript 的 this 指向主要是依赖上下文对象决定,箭头函数例外。

默认绑定


在全局作用域下调用函数,函数的this默认指向window

注意1:严格模式下,默认指向undefined

function test() {
console.log(this.a);
} var a = 1;
test(); // 1 // 严格模式
function test() {
'use strict';
console.log(this.a);
} var a = 1;
test(); // TypeEror 报错

注意2:全局作用域下 var声明的变量会默认绑定到window,而letconst声明的变量不会

let a = 1;
var b = 1; window.a // undefined
window.b // 1

隐式绑定


当函数引用有上下文对象时,this隐式绑定到这个上下文对象中。

function test() {
console.log(this.a);
} var obj = {
a: 1,
test: test
} var a = 2; obj.test(); // 1

隐式丢失

function test() {
console.log(this.a);
} var obj = {
a: 1,
test: test
} var a = 2; // 隐式丢失,this 应用默认绑定规则
var bar = obj.test;
bar() // 2

显式绑定

callapplybind等显式改变this指向。

注意:非严格模式下,callapplybind等传入nullundefined会默认转为window

function test() {
console.log(this.a);
} var obj = {
a: 1
} var a = 2; test(); // 2
test.call(obj); // 1
test.apply(obj); // 1 var bTest = test.bind(obj);
bTest(); // 1

注意2:多次使用bindthis只会指向第一次bindthis

function test() {
console.log(this.a);
} var obj1 = { a: 1 }
var obj2 = { a: 2 }
var obj3 = { a: 3 } var bind1 = test.bind(obj1);
bind1(); // 1 var bind2 = bind1.bind(obj2);
bind2(); // 1 var bind3 = bind2.bind(obj3);
bind3(); // 1

内置函数改变this指向

function test() {
console.log(this.a);
} var obj = {
a: 1
} var arr = [1, 2, 3];
arr.forEach(test, obj); // 打印 3 个 1

new 绑定

使用new操作符会产生如下步骤:

  1. 创建一个新的空对象。
  2. 将新对象与构造函数的prototype相连。
  3. 新对象绑定带构造函数的this
  4. 如果构造函数有返回值,且返回值是对象,则返回构造函数的返回值,否则返回新建的对象。
function create() {
let obj = new Object(); let constructor = [].shift.call(arguments); // obj.__proto__ = constructor.prototype;
Object.setPrototypeOf(obj, constructor.prototype); // 改变 this
let res = constructor.apply(obj, arguments); const isObj = Object.prototype.toString.call(res) === '[object Object]';
return isObj ? result : obj;
}

箭头函数


箭头函数比较特殊,它有以下几个特点:

  1. 没有自身的this,在定义时默认绑定父级作用域的this,即采用词法作用域绑定this.

  2. 没有原型 prototype,无法使用 new 操作符,即不能作为构造函数.

  3. 无法使用callapplybind等显式改变其this.

    const test = () => console.log(this);
    let obj = {}; test(); // window
    test.call(obj); // window const foo = test.bind(obj);
    foo(); // window

javascripts的this的更多相关文章

  1. JavaScripts基础

    JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.( ...

  2. HTML JavaScripts

    JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. ...

  3. javascripts学习笔记(五):用js来实现缩略语列表、文献来源链接和快捷键列表。

    1 缩略语列表问题出发点:一段包含大量缩略语的文本,例如: <p> The <abbr title="World Wide Web Consortium"> ...

  4. FW: javascripts 要不要加引号

    Javascript编程风格  http://www.ruanyifeng.com/blog/2012/04/javascript_programming_style.html 作者: 阮一峰 日期: ...

  5. JavaScripts 基础详细笔记整理

    一.JS简介 JavaScript 是 Web 的编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理 ...

  6. javascripts 实习自动提交表单 onsubmit

    html: <form id="formwb" onsubmit="return setPassword();"> <script> d ...

  7. JavaScripts学习日记——XML DTD Schema

    今日关键词: XML DTD Schema 1.XML 1 XML的概述 1.1 什么是XML XML全称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和 ...

  8. JavaScripts学习日记——DOM SAX JAXP DEMO4J XPath

    今日关键词: XML解析器 DOM SAX JAXP DEMO4J XPath XML解析器 1.解析器概述 什么是解析器 XML是保存数据的文件,XML中保存的数据也需要被程序读取然后使用.那么程序 ...

  9. JavaScripts学习日记——DOM

    DOM Document Object Model 文档对象模型  整合js和html css.控制html文档行为.DOM就是把页面当中所有内容全部封装成对象.HTML文档中万物皆对象.1.对象的分 ...

  10. JavaScripts学习日记——BOM

    IE 3.0 和 Netscape Navigator 3.0 提供了一种特性 - BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执 ...

随机推荐

  1. Linux 性能分析 工具命令

    背景知识:具备背景知识是分析性能问题时需要了解的.比如硬件 cache:再比如操作系统内核.应用程序的行为细节往往是和这些东西互相牵扯的,这些底层的东西会以意想不到的方式影响应用程序的性能,比如某些程 ...

  2. 和内嵌的iframe进行通讯

    利用内置iframe进行通讯 1. 在当前网页设置iframe网页(监听iframe发来postmessage消息事件) a. 外部网页接收数据: 回调方法,其中e.data为传入数据: const ...

  3. 06_TypeScript泛型

    1.泛型的定义 泛型就是解决 类,接口 方法的复用性,以及对不特定数据的支持(类型校验). 2.泛型函数 //T 表示泛型,具体什么类型是调用这个方法的时候决定的, //T可以用其他大写字母表示,传入 ...

  4. python新手如何编写一个猜数字小游戏

    此文章只针对新手,希望大家勿喷,感谢!话不多说先上代码: import random if __name__ == '__main__': yourname = input("你好! 你的名 ...

  5. C#设计模式学习笔记:(13)模板方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7837716.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第一个模式--模 ...

  6. C#设计模式学习笔记:(11)享元模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7792973.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第六个模式--享 ...

  7. 实战kudu集成impala

    推荐阅读: 论主数据的重要性(正确理解元数据.数据元) CDC+ETL实现数据集成方案 Java实现impala操作kudu 实战kudu集成impala impala基本介绍 ​        im ...

  8. 1、SSH无密码访问

    1.在需要无密码登录远程服务器的机器上(如A→B服务器)生成密码对 A:服务器操作: ssh-keygen -t rsa :输出的内容直接一路回车即可(enter) 执行上面一步,会在~/.ssh目录 ...

  9. Html介绍,了解html代码的注释

    什么是代码注释?在代码编辑器中的注释代码是不会在浏览器窗口展示的!html代码注释的作用是帮助程序员标注代码的用途,过一段时间后再看你之前编写的代码,很快可以想起这个代码的用途.代码注释不仅方便程序员 ...

  10. 解决BitLocker反复提示恢复密钥正确而无法进入系统的问题

    前一阵电脑因为装了grub,引导策略被改了.开Windows要求输入恢复密钥以进行恢复.我登陆过Microsoft账户所以在官网上找到了密钥并恢复了驱动器.但是进去提示"恢复密钥正确&quo ...