一、函数的调用方式决定了 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指向的方法的更多相关文章

  1. 前端js中this指向及改变this指向的方法

    js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的 ...

  2. this(this的4种指向和改变this指向的方式)

    this是Javascript语言的一个关键字. 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 1.this指向的形式4种 a.如果是 ...

  3. 可以改变this指向的方法

    this一般指向的是当前被调用者,但也可以通过其它方式来改变它的指向,下面将介绍三种方式: 1.call用作继承时: function Parent(age){ this.name=['mike',' ...

  4. 改变this指向的三种方法

    call.apply.bind三者为改变this指向的方法. 共同点:第一个参数都为改变this的指针.若第一参数为null/undefined,this默认指向window call(无数个参数) ...

  5. js中改变this指向的call、apply、bind 方法使用

    前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...

  6. (三十七)js改变this指向的方法

    最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧. 1.改变函数内部的this指向的三种方法 ...

  7. 五、React事件方法(自写一个方法(函数),然后用按钮onClick触发它、自写方法改变this指向3种写法、

    上接:https://www.cnblogs.com/chenxi188/p/11782349.html 项目目录: my-app/ README.md node_modules/ package.j ...

  8. Javasript中this指向问题和改变this指向的方法

    在学习javascript中我们往往会被this的指向问题弄的头昏转向,今天我们就来学习一下this的指向问题,和改变this指向的方法. 一.this的指向问题 在学习this的指向问题之前我们需要 ...

  9. ES5中改变this指向的三种方法

    ES5中提供了三种改变函数中this指针指向的方法,分别如下 1.call() var obj = {username:"孙悟空"}; //没有任何修饰的调用函数,函数中的this ...

随机推荐

  1. 如何快速上手Mac

    网络上关于Mac的教程很多,大部分问题通过百度和谷歌就能搞定了.对于技巧的细节,我将不再过多的重复,看了我的参考资料基本就能够全部了解,他们也比我讲得详细得很多.我这篇文章想做的,是以一个普通的win ...

  2. mac 连接linux服务器,用scp命令实现本地文件与服务器文件之间的互相传输

    mac连接linux服务器 打开终端,切换到root权限下,切换root权限命令:sudo -i 通过ssh命令连接linux服务器:ssh root@ip地址(root是账户名) 然后根据提示输入密 ...

  3. jQuery使用(十二):工具方法之ajax的无忧回调(优雅的代码风格)

    jQuery.ajax()方法的应用 jQuery.ajax()的无忧回调(优雅的代码风格) 一.jQuery.ajax()方法的应用 jQuery.ajax()实质上就是在ajax的基础上进行了封装 ...

  4. Ubuntu16.04的图形化界面无法启动问题

    昨晚在 Ubuntu 下试图安装笔记本触控板的驱动的时候,突然 Ubuntu 的图形化界面不见了,尝试了 Ctrl + Alt + F1.F2.F3...无果,又在一些博客的指导下尝试在命令行使用 s ...

  5. 《Java》第八周学习总结

    第八周学习内容:课本第15章节的内容泛型与集合框架  主要内容有 -泛型-链表-堆栈-散列映射-树集-树映射 重点和难点-重点:泛型和集合的使用码云:https://gitee.com/ShengHu ...

  6. go语言圣经练习

    练习 3.10: 编写一个非递归版本的comma函数,使用bytes.Buffer代替字符串链接操作. package main import ( "fmt" "os&q ...

  7. webbrowser设置为相应的IE版本

    注册表路径: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATU ...

  8. idea integrate project

    idea的integrate project功能,版本控制工具:svn 之前我对这个功能的误解太深了,这里特别记录一下这个功能的使用,首先上图 先看这里的source1和source2,里面填的是sv ...

  9. pythonのdjango Form简单应用。

    Form表单有两种应用场景: 1.生成HTML标签. 2.验证输入内容. 如果我们在django程序中使用form时,需要在views中导入form模块 from django import form ...

  10. ZYNQ基础知识一

    参考:UG1181 Zynq-7000 Programable Soc Architrcture Porting Quick Start Guide                           ...