js中this的使用及代表意义
我们在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的使用及代表意义的更多相关文章
- JS中常见问题
//s金额 n保留几位小数 默认保留两位小数 s代表金额,n代表保留的小数位数 function formatMoney(s, n) { n = n > 0 && n <= ...
- js中,null, '',undefined的区别
在js中有三种值都可以代表false "",null,undefined 那么他们之间到底有什么区别呢 首先我们先看这三种值得类型 ""代表了一个没有字符的字 ...
- js中#代表什么
js中#代表什么 一.总结 1.#号:代表id选择器 2. $('#div1'). : 常用用法,前面也有$符号 二."#"在js中代表什么 js里我不曾看到用到‘#’的代码端, ...
- js中的$符号代表什么
js中的$符号代表什么 一.总结 1.$:相当于document.getElementById(...) 2.$常用用法:每句话意思下面有,好东西 $("div p"); // ( ...
- js中 a : function(){}这是什么格式? 代表什么含义?怎样学习这样的格式?
js中的json. 一种轻量级数据格式.json中的值是map形式的就是key->value. 具体看下边的示例; var person = { // 用 大括号括声明一个json. " ...
- js中~~和^=分别代表什么,用处是什么?
先看个栗子: ~~false === 0 ~~true === 1 ~~undefined === 0 ~~!undefined === 1 ~~null === 0 ~~!null === 1 ~~ ...
- js中的位运算
按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...
- JS中判断鼠标按键的问题
JS中判断鼠标按键的问题.IE左键是 window.event.button = 1右键是 window.event.button = 2中键是 window.event.button = 4没有按键 ...
- js中的各种宽高以及位置总结
在javascript中操作dom节点让其运动的时候,常常会涉及到各种宽高以及位置坐标等概念,如果不能很好地理解这些属性所代表的意义,就不能理解js的运动原理,同时,由于这些属性概念较多,加上浏览器之 ...
随机推荐
- SpringBoot正确打日志的姿势
前篇 Spring Boot 日志处理你还在用Logback? 本文简介 前篇侧重 Log4j2 的配置,本篇侧重统一日志处理的应用,以下包含 HTTP 请求的日志处理.Exception 异常日志处 ...
- 一句话CF
目录 \(\bf {Round \ \#500 \ (Div. \ 1)}\) \(\bf {Round \ \#589 \ (Div. \ 2)}\) \(\bf {Avito \ Cool \ C ...
- javascript 作用域链及性能优化
在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象.函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性.其中一个内部属 ...
- postman发送json参数到后端controller报错415的解决方案
警告 [http-nio-8080-exec-9] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.l ...
- 【原创】python倒排索引之查找包含某主题或单词的文件
什么是倒排索引? 倒排索引(英语:Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射.它是文 ...
- python之变量名
在python中,变量不需要提前声明,创建时直接对其赋值即可,变量类型由赋给变量的值决定.值得注意的是,一旦创建了一个变量,就需要给该变量赋值. 变量名应严格遵守以下规则: 1.变量名只能包含:字母/ ...
- C/C++企业链表的实现
首先 先介绍企业链表 和Linux内核链表 和 之前我发的一篇单项链表的区别 结构体变量名是结构体的首地址吗? 这个问题会在待会链表实现中体现!! 答案:有些编译器 支持用结构体变量名做地址的方式但一 ...
- PHP 当Swoole 遇上 ThinkPHP5
本文假设你已经有了 Linux 操作系统的 PHP 环境,强烈推荐使用 Vagrant 来搭建开发环境 安装 Swoole PECL 拓展可以通过 pecl 命令或者通过源码包编译安装,本文采用 pe ...
- saprk性能调优参考
1.Tuning Spark 文档 原文:http://spark.apache.org/docs/latest/tuning.html 翻译参考:https://www.cnblogs.com/lh ...
- stdClass Object 数据的处理
stdClass Object 数据的处理 在调用接口的时候往往返回的是 stdClass Object 类型的数据,我们在取数据值的时候就阔以直接使用对象->属性值的方式操作值 $ret = ...