我们在js中经常看到this这个关键字,那么他是什么呢?它可以是全局对象、当前对象,也可以是任意对象,函数的调用方式决定了 this 的值。

1. 方法中的this。

  在对象方法中, this 指向调用它所在方法的对象。例如:

var information = {
name: "alan",
age : "18",
all : function() {
return this.name + " " + this.age;
}
};

  在这里,this 表示 information 对象。all 方法所属的对象就是 information。

2. 单独直接调用this.

  单独使用 this,则它指向全局(Global)对象。例如:

var name = this;
&&
"use strict";(严格模式)
var name = this;

3. 函数中调用this.

  在函数中,函数的所属者默认绑定到 this 上。例如:

function information() {
return this;
}
&&
"use strict";(严格模式)
function information() {
return this;
}

4. 箭头函数调用this.

  ES6 新增了箭头函数,箭头函数不仅更加整洁,还对 this 的指向进行了改进。箭头函数会从作用域链的上一层继承 this。

var obj = {
y: function() {
console.log(this === obj) var getX = () => {
console.log(this === obj)
}
getX()
}
} obj.y()
// true
// true

  和普通函数不一样,箭头函数中的 this 指向了 obj,这是因为它从上一层的函数中继承了 this,你可以理解为箭头函数修正了 this 的指向。例如:

var x = 1
var obj = {
x: 2,
y: function() {
var getX = () => {
console.log(this.x)
}
return getX()
}
} obj.y() //
var a = obj.y
a() //

  obj.y() 在运行时,调用它的对象是 obj,所以 y 中的 this 指向 obj,y 中的箭头函数 getX 继承了 y 中的 this,所以结果是 2。如果我们先将 y 赋值给全局作用域中的变量 a,a 在运行时,y 中的 this 便指向了全局对象,所以得到的结果是 1(非严格模式)。

5. js事件中调用this.  

  this 指向了接收事件的 HTML 元素。例如:

<button onclick="this.style.display='block'">显示</button>

6. 使用call和apply

  改变 this 的指向,可以使用 call 或 apply 方法,它们都可以改变函数的调用对象。将一个对象作为第一个参数传给 call 或 apply,this 便会绑定到这个对象。如果第一个参数不传或者传 null 、undefined,默认 this 指向全局对象(非严格模式)或 undefined(严格模式)。

var x = 1;
var obj = { x: 2 }
function getX() {
console.log(this.x)
} getX.call(obj) // 2
getX.apply(obj) // 2
getX.call() // 1
getX.apply(null) // 1
getX.call(undefined) //

  

  使用 call 和 apply 时,如果给 this 传的不是对象,JavaScript 会使用相关构造函数将其转化为对象,比如传 number 类型,会进行 new Number() 操作,传 string 类型,会进行 new String() 操作。

function demo() {
console.log(Object.prototype.toString.call(this))
} demo.call('hello') // [object String]
demo.apply(5) // [object Number]

  call 和 apply 的区别在于,call 的第二个及后续参数是一个参数列表,apply 的第二个参数是数组。参数列表和参数数组都将作为函数的参数进行执行。

var x = 1
var obj = {
x: 2
} function getSum(y, z) {
console.log(this.x + y + z)
} getSum.call(obj, 3, 4) //
getSum.apply(obj, [3, 4]) //

7. bind方法调用this.

  bind 方法会创建一个新函数,新函数的 this 会永久的指向 bind 传入的第一个参数。例如:

var x = 1
var obj_1 = {
x: 2
}
var obj_2 = {
x: 3
} function getX() {
console.log(this.x)
} var a = getX.bind(obj_1)
var b = a.bind(obj_2) getX() //
a() //
b() //
a.call(obj_2) //

  虽然我们尝试给函数 a 重新指定 this 的指向,但是它依旧指向第一次 bind 传入的对象,即使是使用 call 或 apply 方法也不能改变这一事实。

this 是 JavaScript 中非常重要的关键字,不同的运行环境和调用方式都会对 this 产生影响。理解它能让我们更熟练地使用这门语言!

js中this的使用及代表意义的更多相关文章

  1. JS中常见问题

    //s金额 n保留几位小数 默认保留两位小数 s代表金额,n代表保留的小数位数 function formatMoney(s, n) { n = n > 0 && n <= ...

  2. js中,null, '',undefined的区别

    在js中有三种值都可以代表false  "",null,undefined 那么他们之间到底有什么区别呢 首先我们先看这三种值得类型 ""代表了一个没有字符的字 ...

  3. js中#代表什么

    js中#代表什么 一.总结 1.#号:代表id选择器  2. $('#div1'). : 常用用法,前面也有$符号 二."#"在js中代表什么 js里我不曾看到用到‘#’的代码端, ...

  4. js中的$符号代表什么

    js中的$符号代表什么 一.总结 1.$:相当于document.getElementById(...) 2.$常用用法:每句话意思下面有,好东西 $("div p"); // ( ...

  5. js中 a : function(){}这是什么格式? 代表什么含义?怎样学习这样的格式?

    js中的json. 一种轻量级数据格式.json中的值是map形式的就是key->value. 具体看下边的示例; var person = { // 用 大括号括声明一个json. " ...

  6. js中~~和^=分别代表什么,用处是什么?

    先看个栗子: ~~false === 0 ~~true === 1 ~~undefined === 0 ~~!undefined === 1 ~~null === 0 ~~!null === 1 ~~ ...

  7. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

  8. JS中判断鼠标按键的问题

    JS中判断鼠标按键的问题.IE左键是 window.event.button = 1右键是 window.event.button = 2中键是 window.event.button = 4没有按键 ...

  9. js中的各种宽高以及位置总结

    在javascript中操作dom节点让其运动的时候,常常会涉及到各种宽高以及位置坐标等概念,如果不能很好地理解这些属性所代表的意义,就不能理解js的运动原理,同时,由于这些属性概念较多,加上浏览器之 ...

随机推荐

  1. c# 保留两位小数点

    保留两位小数点 由于简单的原因大家直接看代码块. using System; namespace HelloWorld { class Program { static void Main(strin ...

  2. Linux下修改文件权限,所有权

    Linux与Unix是多用户操作系统,所以文件的权限与所有权的实现就显得很有必要:每个文件主要与三组权限打交道,分别是用户(user),用户组(group),其他用户(other) 用户(u)是文件的 ...

  3. Python基础语法,他其实很贵!

    # -*- coding:utf-8 -*- # @Time :2019/7/19 11:26# @Author :ITester# @Email :1036881587@qq.com# @File ...

  4. 大数据之路week01--day02_2 集合方面的总结

    (初稿 太晚了,明天再进行补充) 1.对象数组(掌握) (1)数组既可以存储基本数据类型,也可以存储引用类型.它存储引用类型的时候的数组就叫对象数组. (2)案例: 用数组存储5个学生对象,并遍历数组 ...

  5. Golang 类型定义总结手册| 面试最基础

    变量 var 关键字是 var ,定义后须被调用 支持多个同时定义 支持使用 := 缺省定义 变量定义(声明) //使用var 关键字 进行变量定义 : var + 变量名 + 变量类型 //Var ...

  6. GO 基础学习笔记(1) | 简介

    一.官网查看系列 Golang官网:https://golang.org/ Golang中文网:https://studygolang.com/(推荐) 项目学习网站: https://gowalke ...

  7. 为什么我加了索引,SQL执行还是这么慢(一)?

    在MySQL中,有一些语句即使逻辑相同,执行起来的性能差异确实极大的. 先抛出一个结论:如果想使用索引树搜索功能,就不能使用数据库函数来处理索引字段值,而是在不改变索引字段值的同时,自己通过SQL语句 ...

  8. java多线程回顾3:线程安全

    1.线程安全问题 关于线程安全问题,有一个经典案例:银行取钱问题. 假设有一个账户,有两个线程从账户里取钱,如果余额大于取钱金额,则取钱成功,反之则失败. 下面来看下线程不安全的程序会出什么问题. 账 ...

  9. Maven和Gradle中配置单元测试框架Spock

    Maven Maven本身不支持其他JVM语言(例如Groovy或Scala).要在Maven项目中使用它,需要使用第三方插件.对于Groovy而言,最好的选择似乎是GMavenPlus(重写不再维护 ...

  10. 关于RAID 5的介绍与创建

    一.简介 定义: RAID 5是RAID 0和RAID 1的折中方案.RAID 5具有和RAID0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢.同时由于多 ...