zoukankan      html  css  js  c++  java
  • js基础--this、apply、call、bind

    this

    this 指向调用它的那个对象

    
    
    var name = "windowsName";
    
        var a = {
            name : "Cherry",
    
            func1: function () {
                console.log(this.name)     
            },
    
            func2: function () {
                setTimeout(  function () {
                    this.func1()
                },100);
            }
    
        };
    
        a.func2()     // this.func1 is not a function

    最后调用 setTimeout 的对象是 window,但是在 window 中并没有 func1 函数。

    改变this指向的方法

    1.箭头函数 

    箭头函数的 this 始终指向函数定义时的 this,而非执行时

     var name = "windowsName";
    
        var a = {
            name : "Cherry",
    
            func1: function () {
                console.log(this.name)     
            },
    
            func2: function () {
                setTimeout( () => {
                    this.func1()
                },100);
            }
    
        };
    
        a.func2()     // Cherry

    2.使用 apply、call、bind

     var a = {
            name : "Cherry",
    
            func1: function () {
                console.log(this.name)
            },
    
            func2: function () {
                setTimeout(  function () {
                    this.func1()
                }.apply(a),100);
            }
    
        };
    
        a.func2()            // Cherry

    apply

    apply() 方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数

    fun.apply(thisArg, [argsArray])
    thisArg:在 fun 函数运行时指定的 this 值。需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。

    call

    apply 和 call 基本类似,他们的区别只是传入的参数不同

    fun.call(thisArg[, arg1[, arg2[, ...]]])

    bind

    bind() 方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

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

    3.new 关键字

    new的过程

    1. 创建一个空对象 obj;
    2. 将新创建的空对象的隐式原型指向其构造函数的显示原型。
    3. 使用 call 改变 this 的指向
    4. 返回该对象。

    伪代码

    var a = new myFunction("Li","Cherry");
    
    new myFunction{
        var obj = {};
        obj.__proto__ = myFunction.prototype;
        var result = myFunction.call(obj,"Li","Cherry");
        return obj
     }
  • 相关阅读:
    亚洲区哈尔滨赛区网络预选赛over
    背包问题
    Memcache基础教程
    Telnet的命令
    Telnet技术白皮书
    workthread模式
    Telnet的命令
    telnet 测试memcached
    telnet 测试memcached
    Memcache基础教程
  • 原文地址:https://www.cnblogs.com/yaokunlun/p/14402880.html
Copyright © 2011-2022 走看看