this指向及改变this指向的方法
一、函数的调用方式决定了 this 的指向不同,但总的原则,this指的是调用函数的那个对象:
1.普通函数调用,此时 this 指向 全局对象window
function fn() {
console.log(this); // window
}
fn(); // window.fn(),此处默认省略window

2.在严格模式下"use strict",为undefined.
function foo(){
"use strict"; //表示使用严格模式
console.log(this); //在严格模式下this指向undefined
}
foo();
3.对象的方法里调用,this指向调用该方法的对象
let person = {
name:'Lucy',
age:,
say:function(){
console.log(this); //object person
console.log(this.name); //Lucy
}
}
person.say();

4.构造函数调用, 此时 this 指向 new出来的实例对象
function Person(age, name) {
this.age = age;
this.name = name
console.log(this) // 此处 this 分别指向 Person 的实例对象 p1 p2
}
var p1 = new Person(, 'zs')
var p2 = new Person(, 'ww')

5.通过事件绑定的方法, 此时 this 指向 绑定事件的对象
<body>
<button id="btn">hh</button>
<script>
var oBtn = document.getElementById("btn");
oBtn.onclick = function() {
console.log(this); // btn
}
</script>
</body>

6.定时器函数, 此时 this 指向 全局对象window
var name = "Tom";
var person = {
name:'Lucy',
age:,
say:function(){
console.log(this); //object person
console.log(this.name); //Lucy
setTimeout(function(){
console.log(this.name); //此处this指向全局对象window,故此时输出Tom
},)
}
}
person.say();

二、更改this指向的三个方法
1.call() 方法
call(thisScope, arg1, arg2, arg3...)
call,可以传入多个参数,改变this指向后立刻调用函数
var Person = {
name:"lixue",
age:
}
function fn(x,y){
console.log(x+","+y);
console.log(this);
}
fn("hh",);

没错,就像上面说的,普通函数的this指向window,现在让我们更改this指向

var Person = {
name:"lixue",
age:
}
function fn(x,y){
console.log(x+","+y);
console.log(this);
console.log(this.name);
console.log(this.age);
}
fn.call(Person,"hh",);

看,现在this就指向person了
2.apply() 方法
apply(thisScope, [arg1, arg2, arg3...]);两个参数

apply() 与call()非常相似,不同之处在于提供参数的方式,apply()使用参数数组,而不是参数列表
3.bind()方法
bind(thisScope, arg1, arg2, arg3...),bind 改变this的指向,返回的是函数

bind()创建的是一个新的函数(称为绑定函数),与被调用函数有相同的函数体,当目标函数被调用时this的值绑定到 bind()的第一个参数上
三、改变this指向的例子
var oDiv1 = document.getElementById("div1");
oDiv1.onclick = function(){
setTimeout(function(){
console.log(this); //定时器里的this指向window
},)
}

没错,就像上面所说,定时器里的this指向window,那么怎么改成指向div呢
var oDiv1 = document.getElementById("div1");
oDiv1.onclick = function(){
setTimeout(function(){
console.log(this);
}.bind(this),)
}

因为在定时器外,在绑定事件中的this肯定指向绑定事件的对象div啊,用call和apply都行
上图就是用bind改变了this指向,但改变定时器中的this指向,我们有个更好的方法

var name = "Tom";
var person = {
name:'Lucy',
age:,
say:function(){
var _this = this; //定义一个_this变量来存储this
console.log(this.name); //Lucy
setTimeout(function(){
console.log(_this.name); //Lucy
console.log(_this.age); //
},)
}
}
person.say();

定义一个_this变量来存储this值,使全局对象里面的this 指向person 的this
this指向及改变this指向的方法的更多相关文章
- 前端js中this指向及改变this指向的方法
js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的 ...
- this(this的4种指向和改变this指向的方式)
this是Javascript语言的一个关键字. 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 1.this指向的形式4种 a.如果是 ...
- 可以改变this指向的方法
this一般指向的是当前被调用者,但也可以通过其它方式来改变它的指向,下面将介绍三种方式: 1.call用作继承时: function Parent(age){ this.name=['mike',' ...
- 改变this指向的三种方法
call.apply.bind三者为改变this指向的方法. 共同点:第一个参数都为改变this的指针.若第一参数为null/undefined,this默认指向window call(无数个参数) ...
- js中改变this指向的call、apply、bind 方法使用
前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...
- (三十七)js改变this指向的方法
最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧. 1.改变函数内部的this指向的三种方法 ...
- 五、React事件方法(自写一个方法(函数),然后用按钮onClick触发它、自写方法改变this指向3种写法、
上接:https://www.cnblogs.com/chenxi188/p/11782349.html 项目目录: my-app/ README.md node_modules/ package.j ...
- Javasript中this指向问题和改变this指向的方法
在学习javascript中我们往往会被this的指向问题弄的头昏转向,今天我们就来学习一下this的指向问题,和改变this指向的方法. 一.this的指向问题 在学习this的指向问题之前我们需要 ...
- ES5中改变this指向的三种方法
ES5中提供了三种改变函数中this指针指向的方法,分别如下 1.call() var obj = {username:"孙悟空"}; //没有任何修饰的调用函数,函数中的this ...
随机推荐
- 阅读阿里文档总结————Mysql数据库篇
一:建表规范 1.针对于任何字段如果为非负数,必须是 unsigned: 2.表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除: (1为是:0为否) 3.主键索引名为 pk_字 ...
- jvm 字节码执行 (一)方法调用
“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上,而虚拟机的执行引擎是 由自己实现的,因此可以自行制定指令集 ...
- vue的计算属性与方法的不同
计算属性 vue的模板里可以使用表达式,但是它的设计初衷是用于简单计算,在模板中放入太多逻辑会让模板过重且难以维护.例如: <div id="example"> {{ ...
- docker学习------docker login Harbor失败,需添加http允许权限
systemctl status docker 到docker的service文件里更改配置 加上这行参数就ok了,然后重启docker
- 关于读取XML文件代码【学习笔记】
public class XmlManager { private XmlDocument m_XMLDoc = null; public XmlManager(XmlDocument xmldoc) ...
- IntelliJ IDEA 的默认文件编码
建好项目,首先注意改项目默认编码 File->Settings(快捷键Ctrl+Alt+S)->Editor->File Encodings File->Other Setti ...
- linux文件常用命令
文件管理不外乎文件或目录的创建.删除.查询.移动,有mkdir/rm/mv 2.1. 创建和删除 创建:mkdir 删除:rm 删除非空目录:rm -rf file目录 删除日志 rm *log (等 ...
- java控制多线程同时写一个文件
最近出现一个需求,大体要做的就是控制多线程同时操作一个文件.当时第一个反应是不要用synchronized,太low了,然后我就使用了读写锁ReentrantReadWriteLock,然后写完静下来 ...
- VGA、DVI、HDMI三种视频信号接口
目前,电脑显示器常见的接口主要有HDMI.DP.DVI.VGA等4种接口.显示器数据线性能排名:DP>HDMI>DVI>VGA.其中 VGA是模拟信号,已经被主流所淘汰,DVI.H ...
- XAMARIN 安卓程序闪退问题
参考:https://forums.xamarin.com/discussion/25780/unfortunately-app-name-has-stopped 在VS 2017中使用Xamarin ...