美文网首页Javascript教程
Javascript教程(九)this指向

Javascript教程(九)this指向

作者: klmhly | 来源:发表于2018-05-23 19:29 被阅读0次

this对象是在运行时基于函数的执行环境绑定的。
全局函数中,this等于window
而当函数被作为某个对象的方法调用时,this等于那个对象

1. 全局环境
没有在对象内部定义的函数是全局函数,全局函数和全局变量都是window的对象

    var name = 'jero';
    function sayName () {
        console.log(this.name);
    }

    sayName()        //直接全局调用
    window.name;      //用window全局对象调用
    window.sayName();   //用window全局对象调用

2. 指向调用的对象

    var name = 'jero';           //全局变量
    function sayName () {     //全局函数
        console.log(this.name);
    }
    var obj = {                 //obj对象
        name: 'henry'
    };
    obj.sayName = sayName;   //  给obj对象新增一个sayName方法
    obj.sayName()   //obj对象调用sayName方法,this指向obj对象,因此name是herry,输出herry。

3. 测试

//定义了全局变量price
var price = 10;

//定义了全局函数getPrice
var getPrice = function () {
    return price;
}

//定义了对象apple
var apple = {
    price: 8,                       //apple对象的price属性
    getPrice: function () {        //apple对象的getPrice方法
        return this.price;
    }
};

//直接调用全局函数getPrice,得出结果result1
var result1 = getPrice();

//将apple的getPrice方法赋值给全局函数getPrice,相当于重新定义了全局函数getPrice
var getPrice = apple.getPrice;

//直接调用被更新了的全局函数,this指向window,window.price=10,得到result2
var result2 = getPrice()

//调用apple的getPrice方法,因此,this指向apple对象,apple.price=8,得到result3
var result3 = apple.getPrice();

console.log(result1);    //10
console.log(result2);    //10
console.log(result3);    //8

4. 改变this指向的3个方法
(1)bind
(2)call
(2)apply

apply()把参数打包成数组再传入;
call()把参数按顺序传入。
bind()返回一个函数,除此之外和call()传参数情况一样。

比如调用Math.max(3, 5, 4),分别用apply()和call(),bind()实现如下:
对普通函数调用,我们通常把this绑定为null。

Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5
Math.max.bind(null, 3, 5, 4)(); // 5

下面是一个改变指向的综合例子

//定义了全局变量price
var price = 1;

//定义了对象apple
var apple = {
    price: 8,      //apple对象的price属性
    getPrice: function () {  //apple对象的getPrice方法
        return this.price;
    }
};

//定义了对象orange
var orange = {
    price: 10,      //orange对象的price属性
    getPrice: function () {  //orange对象的getPrice方法
        return this.price*2;
    }
};

var result1 = orange.getPrice();
var result2 = apple.getPrice.apply(orange)        //通过apply将this的指向改为orange
var result3 = orange.getPrice.call(this);           //通过call将this的指向改为window
var result4 = orange.getPrice.bind(apple)();   //通过bind将this指向改为apple,因为调用bind返回一个新的函数,所以执行语句比前两个多了()

console.log(result1);    //20
console.log(result2);    //10     
console.log(result3);    //2
console.log(result4);    //16

(1)result1 的值为 20
orange.getPrice 运行时 this 指向 orange, this.price 等于 10, 函数返回 10 * 2 = 20

(2)result2 的值为 10
当前函数体是 apple 的 getPrice, 由于调用时 apply 的参数是 orange, 就是说当前 this 指向的是 orange, this.price 等于 10, 函数返回 this.price, 也就是10。

(3)result3 的值为 2
这里函数体是 orange 的 getPrice, 调用 call 时传的参数是全局的 this, 也就是 window 对象,所以 this.price 等于 1,那么函数运行返回 this.price * 2 的值就是 2。

(4)result4 的值为 16
程序倒数第二行将 apple 作为参数传给 bind 方法,并且将经过 bind 之后的函数覆盖了 orange.getPrice, 那么 orange.getPrice 调用默认的 this 就是指向 apple, 而当前函数体还是 orange 的 getPrice, 所以运行的结果为 8 * 2 = 16

相关文章

网友评论

    本文标题:Javascript教程(九)this指向

    本文链接:https://www.haomeiwen.com/subject/owoljftx.html