El punto de esto en la función y el método de cambiar el punto

1, este punto

El punto de esto se determina cuando llamamos a la función, y la diferencia en el método de llamada determina el punto de esto.
Por lo general, apunte a nuestra persona que llama.

Método de llamada esto apunta a
Llamada a función ordinaria ventana
Llamada al constructor Los métodos en el objeto prototipo del objeto de instancia también apuntan al objeto de instancia
Llamada al método de objeto El objeto al que pertenece el método
Llamada al método de enlace de eventos Objeto de evento vinculado
Función de temporizador ventana
Ejecutar la función inmediatamente ventana

2. Cambia este punto dentro de la función.

js específicamente nos proporciona algunos métodos de función para ayudarnos a lidiar con más elegancia con el problema de este apuntar dentro de la función. Hay tres métodos de uso común: bind (), call () y apply ()

1 、 llamar ()

El método call () llama a un objeto, que se entiende simplemente como la forma de llamar a una función, pero puede cambiar este punto de la función (se puede lograr la herencia).

fun.call(thisArg,arg1,arg2)
        var o = {
    
    
            name: 'andy'
        }

        function fn(a, b) {
    
    
            console.log(this);
            console.log(a + b);

        };
        fn.call(o, 1, 2);
        // call 第一个可以调用函数 第二个可以改变函数内的this 指向
        // call 的主要作用可以实现继承
        function Father(uname, age, sex) {
    
    
            this.uname = uname;
            this.age = age;
            this.sex = sex;
        }

        function Son(uname, age, sex) {
    
    
            Father.call(this, uname, age, sex);
        }
        var son = new Son('刘德华', 18, '男');
        console.log(son);
2 、 aplicar ()

El método apply () llama a una función, que se entiende simplemente como la forma de llamar a la función, pero puede cambiar este punto de la función.

fun.apply(thisArg,[argsArray])
  • thisArg: este valor especificado cuando la función divertida se está ejecutando
  • argsArray: el valor pasado debe incluirse en la matriz
  • El valor de retorno es el valor de retorno de la función, porque es la función que llama
  // 2. apply()  应用 运用的意思
       var o = {
    
    
           name: 'andy'
       };

       function fn(arr) {
    
    
           console.log(this);
           console.log(arr); // 'pink'

       };
       fn.apply(o, ['pink']);
       // 1. 也是调用函数 第二个可以改变函数内部的this指向
       // 2. 但是他的参数必须是数组(伪数组)
       // 3. apply 的主要应用 比如说我们可以利用 apply 借助于数学内置对象求数组最大值 
       // Math.max();
       var arr = [1, 66, 3, 99, 4];
       var arr1 = ['red', 'pink'];
       // var max = Math.max.apply(null, arr);
       var max = Math.max.apply(Math, arr);
       var min = Math.min.apply(Math, arr);
       console.log(max, min);
3 、 enlazar ()

El método bind () no llama a la función, pero puede cambiar el esto interno para que apunte a
fun.bind (thisArg, arg1, arg2, ...)

Si hay una función que no necesitamos llamar inmediatamente, pero queremos cambiar este punto dentro de esta función, use bind en este momento

  • El valor de retorno es una copia de la función original modificada por el valor especificado y los parámetros de inicialización.
//  <button>点击</button>
    <button>点击</button>
    <button>点击</button>
    <script>
        // 改变函数内this指向  js提供了三种方法  call()  apply()  bind()

        // 3. bind()  绑定 捆绑的意思
        var o = {
    
    
            name: 'andy'
        };

        function fn(a, b) {
    
    
            console.log(this);
            console.log(a + b);


        };
        var f = fn.bind(o, 1, 2);
        f();
        // 1. 不会调用原来的函数   可以改变原来函数内部的this 指向
        // 2. 返回的是原函数改变this之后产生的新函数
        // 3. 如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind
        // 4. 我们有一个按钮,当我们点击了之后,就禁用这个按钮,3秒钟之后开启这个按钮
        // var btn1 = document.querySelector('button');
        // btn1.onclick = function() {
    
    
        //     this.disabled = true; // 这个this 指向的是 btn 这个按钮
        //     // var that = this;
        //     setTimeout(function() {
    
    
        //         // that.disabled = false; // 定时器函数里面的this 指向的是window
        //         this.disabled = false; // 此时定时器函数里面的this 指向的是btn
        //     }.bind(this), 3000); // 这个this 指向的是btn 这个对象
        // }
        var btns = document.querySelectorAll('button');
        for (var i = 0; i < btns.length; i++) {
    
    
            btns[i].onclick = function() {
    
    
                this.disabled = true;
                setTimeout(function() {
    
    
                    this.disabled = false;
                }.bind(this), 2000);
            }
        }
    </script>

Supongo que te gusta

Origin blog.csdn.net/d1063270962/article/details/108664869
Recomendado
Clasificación