js this学习

this的指向是调用时决定的

this 永远指向最后调用它的那个对象

var name = "windowsName";
    function a() {
        var name = "Cherry";
        console.log(this.name);  // windowsName
        console.log(this);    // Window
    }
a(); //window来调用的a函数,所以this指向window
console.log(this)  // Window

 

谁调用的this指向谁,a2调用的this指向a2

 var name2 = "windowsName";
    var a2 = {
        name2: "Cherry",
        fn : function () {
            console.log(this.name2); // Cherry
        }
    }
    a2.fn(); //对象 a2 通过 . 方法调用了其中的 fn 方法。

 

a3里面没有name3,所以找不到

var name3 = "windowsName";
    var a3 = {
        // name: "Cherry",
        fn : function () {
            console.log(this.name3);      // undefined
        }
    }
    a3.fn();

 

调用f()的是window

var name4 = "windowsName4";
    var a4 = {
        name4 : null,
        // name: "Cherry",
        fn : function () {
            console.log(this.name4);      // windowsName4
        }
    }
    var f = a4.fn;
    f();


var name5 = "windowsName5";
    function fn() {
        var name5 = 'Cherry';
        innerFunction();
        function innerFunction() {
            console.log(this.name5);      // windowsName5
        }
    }
    fn()

 

改变 this 的指向有以下几种方法:

使用 ES6 的箭头函数

在函数内部使用 _this = this

使用 apply、call、bind

new 实例化一个对象

var name6 = "windowsName6";
    var a6 = {
        name6 : "Cherry",

        func1: function () {
            console.log(this.name6)     
        },

        func2: function () {
            setTimeout( ()=> {
                console.log(this.name6)  //Cherry
            },100);
        }
    };
a6.func2()
var name7 = "windowsName6";
    var a7 = {
        name7 : "Cherry",

        func1: function () {
            console.log(this.name7)     
        },

        func2: function () {
            setTimeout( function() {
                console.log(this.name7)  //windowsName6
            },100);
        }
    };
    a7.func2()

 

使用 apply

 var a8 = {
     name8 : "Cherry",

     func1: function () {
         console.log(this.name8)
     },

     func2: function () {
         setTimeout(  function () {
             this.func1()
          }.apply(a8),100);
        }
    };
    a8.func2() // Cherry

 

使用 call

var a9 = {
        name : "Cherry",

        func1: function () {
            console.log(this.name)
        },
        func2: function () {
            setTimeout(  function () {
                this.func1()
            }.call(a9),100);
        }
    };
    a9.func2()   // Cherry

 

使用bind()

var a10 = {
        name : "Cherry",
        func1: function () {
            console.log(this.name)
        },

        func2: function () {
            setTimeout(  function () {
                this.func1()
                console.log("func10")
            }.bind(a10)(),100);
        }
    };
    a10.func2() // Cherry

 

bind 是创建一个新的函数,我们必须要手动去调用 才会执行

 var a11 ={
        name : "Cherry",
        fn : function (a,b) {
            console.log( a + b)
        }
    }
    var b = a11.fn;
    b.bind(a11,1,2)()  // 3

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值