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:20,
    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(18, ‘zs‘)
    var p2 = new Person(18, ‘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:20,
    say:function(){
        console.log(this);         //object person
        console.log(this.name);    //Lucy
        setTimeout(function(){
            console.log(this.name);    //此处this指向全局对象window,故此时输出Tom
        },1000)
    }
}
person.say();

二、更改this指向的三个方法

1.call() 方法

call(thisScope, arg1, arg2, arg3...)

call,可以传入多个参数,改变this指向后立刻调用函数

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

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

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

看,现在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
        },1000)
    }

没错,就像上面所说,定时器里的this指向window,那么怎么改成指向div呢

var oDiv1 = document.getElementById("div1");
    oDiv1.onclick = function(){
        setTimeout(function(){
            console.log(this);
        }.bind(this),1000)
    }

因为在定时器外,在绑定事件中的this肯定指向绑定事件的对象div啊,用call和apply都行

上图就是用bind改变了this指向,但改变定时器中的this指向,我们有个更好的方法

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

定义一个_this变量来存储this值,使全局对象里面的this 指向person 的this

原文地址:https://www.cnblogs.com/ysx215/p/10784986.html

时间: 2024-10-04 17:14:55

this指向及改变this指向的方法的相关文章

可以改变this指向的方法

this一般指向的是当前被调用者,但也可以通过其它方式来改变它的指向,下面将介绍三种方式: 1.call用作继承时: function Parent(age){ this.name=['mike','jack','smith']; this.age=age; } function Child(age){ Parent.call(this,age);//把this指向Parent,同时还可以传递参数 } var test=new Child(21); console.log(test.age);/

setTimeout改变this指向

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> var name = "李四"; function Coder(name) { this.name = name; function alerts() { aler

原型对象指向可以改变

原型对象的指向改变 function Person(age){ this.age=10; //在构造函数中的方法 } //人的原型对象的方法 Person.prototype.eat=function(){ console.log("人的吃"); } //学生的构造函数 function Student(){ } Student.prototype.sayHi=function(){ console.log("学生hi"); }; //学生的原型,指向了一个人的实例

React绑定事件this指向问题--改变state中的值

/** * 报错: * Cannot read property 'setState' of undefined * 原因: this指向不一致.btnAddCount中的this 和render中的this * 解决方法: * 方式一: 使用箭头函数 () => { } 箭头函数可以改变this指向,即谁调用,this指向谁 * 方式二: 绑定函数时,添加 ' .bind(this)' onClick={this.btnSubCount.bind(this) * * 在 React 里面,要将

JS高级---原型指向可以改变和原型链

原型指向可以改变和原型链 实例对象的原型__proto__指向的是该对象所在的构造函数的原型对象 构造函数的原型对象(prototype)指向如果改变了, 实例对象的原型(__proto__)指向也会发生改变 原型的指向是可以改变的 实例对象和原型对象之间的关系是通过__proto__原型来联系起来的,这个关系就是原型链 图示如下 代码观测console理解 //人的构造函数 function Person(age) { this.age=10; } //人的原型对象方法 Person.prot

UIButton点击后改变背景的等方法 按钮

请问下UIButton点击后改变背景的方法 http://www.cocoachina.com/bbs/read.php?tid-48666-keyword-UIButton.html ? 1 2 3 4 5 6 7 8 9 10 11 12 13 //初始设置: UIImage *bgImg1 = [UIImage imageNamed:@"Selected.png"]; UIImage *bgImg2 = [UIImage imageNamed:@"Unselected.

方框列数随着浏览器宽度改变而改变的几种方法

方框列数随着浏览器宽度改变而改变的几种方法 一,使用浮动float <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>考察浮动</title> <style type="text/css"> #content { background-color: red; position

C#自定义大小与改变大下的方法

在用VS的窗体设计器时,我们可以发现控件都是可以拖动的,并且还可以调整大小.怎么在自己的程序中可以使用上述功能呢? 下面的方法值得借鉴! using System; using System.Windows.Forms; using System.Drawing; namespace ControlSizeChangeEx { /// <summary> /// This class implements sizing and moving functions for /// runtime

ios 改变图片大小缩放方法

http://www.cnblogs.com/zhangdadi/archive/2012/11/17/2774919.html http://bbs.csdn.net/topics/390898581 ios 改变图片大小缩放方法 -(UIImage*) OriginImage:(UIImage *)image scaleToSize:(CGSize)size{    UIGraphicsBeginImageContext(size);  //size 为CGSize类型,即你所需要的图片尺寸