[js log] Explicación detallada de los métodos de llamada, aplicación y vinculación en JS

1. Diferencia

1.1 El mismo punto de los tres: se utilizan para cambiar la dirección de este

1.2 La diferencia entre llamar () y aplicar ():

  • El mismo punto: ambos llaman a un método de un objeto y reemplazan el objeto actual con otro objeto (misma función)
    Por ejemplo: B.call (A, args1, args2); es decir, el objeto A llama al método del objeto B
    F .apply (G, argumentos); es decir, el método del objeto G aplicación F objeto

  • Diferencias: la forma en que se escriben los parámetros es diferente
    . El primer parámetro de call () es el objeto al que apuntará, y la lista de parámetros se pasa más tarde. El parámetro puede ser de cualquier tipo. Cuando el primer parámetro es nulo o undefined, apunta a por defecto. window;
    apply (): El primer parámetro es el objeto al que apunta, y el segundo parámetro es una matriz

//例如:
var obj = {
    
    }//定义一个空的对象
function f(x,y){
    
    
console.log(x,y)
console.log(this) //this是指obj
}
f.apply(obj,[1,2]) //后面的值需要用[]括起来
f.call(obj,1,2) //直接写

1.3 La diferencia entre call () y bind ():

  • El mismo punto: se utilizan para cambiar el punto de este
  • Diferencias: Después de que call () cambie el punto de esto, la función se ejecutará nuevamente. Después de que bind () cambie esto, la función no se ejecutará, y una función vinculada a la nueva this regresará
//例如:
function f(){
    
    
console.log("看我怎么被调用");
console.log(this) //指向this
}
var obj = {
    
    };
f.call(obj) //直接调用函数
var g = f.bind(obj); //bind()不能调用函数
g();  //此时才调用函数

2. Uso

2.1 Aplicación de call ()

2.1.1 Use call () para determinar el tipo de datos

El uso de typeof para juzgar la forma del tipo de datos generalmente no es demasiado preciso. Podemos usar el método Object.prototype.toString.call () para juzgar el tipo de datos de un dato.

console.log(Object.prototype.toString.call("qq"))            // [Object String] 返回值都是字符串类型
console.log(Object.prototype.toString.call(12))              // [object Number]
console.log(Object.prototype.toString.call(false))           // [object Boolean]
console.log(Object.prototype.toString.call(undefined))       // [object Undefined]
console.log(Object.prototype.toString.call(null))            // [object Null]
console.log(Object.prototype.toString.call(function(){
    
    }))    // [object Function]
console.log(Object.prototype.toString.call([]))              // [object Array]
console.log(Object.prototype.toString.call({
    
    }))              // [object Object]

Podemos usar el contenido de la salida anterior para encapsular una función con el fin de determinar el tipo básico de datos de entrada.

function getType(a){
    
    
     var obj = Object.prototype.toString.call(a); //区分对象类型  确定当前的数据的类型
     var sub = obj.substr(8); 
     // stringObject.substr(start,length)  start 要抽取的子符串的起始下标,
     // length 截取的长度,如果不写则表示从start开始截取到最后 ,stringObject表示某一字符串
    var len = sub.length;
    var sub = sub.substr(0,len-1)
    var rs =  sub.toLowerCase(sub) //转换成小写
    return rs ;
  }
console.log(getType("a")); //string

2.1.2 Use call () para invertir la cadena

//思路:将字符串转化为数组,借用数组中的reverse,将字符串翻转过来
 var str = "abcdefg";
 console.log(Array.prototype.reverse.call(str)); 
 //此时会报错误,即引用类型错误,就是说只有数组才能使用reverse这个方法;(错误写法)

//方法一:这种方法内有使用call()
 var arr =  Array.from(str).reverse().join("") //将字符串转化为数组,在进行翻转,然后在进行拼接
 console.log(arr) //gfedcba
 console.log(typeof arr) //string

//方法二:
var rs = Array.prototype.reverse.call(str.split("")).join(""); 
//splice(start,length)方法用于把一个字符串分割成字符串数组,start 表示从指定的地方分割字符串    length表示分割的长度。
//返回一个一个字符串数组 如果把空字符串 ("") 用为参数那么字符串中的每个字符之间都会被分割
console.log(rs); //gfedcba
console.log(typeof arr) //string

2.2 Aplicación de apply ()

2.2.1 Utilice apply () para encontrar el máximo

var arr =[2,6,8,3,4,9,7,23,56,889]; 
console.log(Math.max.apply(arr,arr)) //第一个arr表示让arr借用max这个方法,第二个arr表示传给max的数据

//apply()所执行的操作:1.执行Math.max(1,2,3,5,4) 2.把内部的this改成arr
1
2
3
4
注意:Math是一个对象,并不是构造器

Supongo que te gusta

Origin blog.csdn.net/u013034585/article/details/105763831
Recomendado
Clasificación