-
terreno común:
- Ambos son un método del objeto función, la función es cambiar el contexto cuando se ejecuta la función, es decir, cambiar el puntero de este dentro del cuerpo de la función.
var name = "lucy";
var obj = {
name: "martin",
say: function () {
console.log(this.name);
}
};
obj.say(); // martin,this 指向 obj 对象
setTimeout(obj.say,0); // lucy,this 指向 window 对象
Nota: Como se puede ver en lo anterior, en circunstancias normales, say
el método genera una salida martin
, pero lo colocamos say
en el método y lo ejecutamos como una función de setTimeout
devolución de llamada en el temporizador. Por lo tanto, al regresar a la pila principal para su ejecución, se ejecuta en el entorno del contexto de ejecución global. En este momento, apuntar, por lo que lo que realmente necesitamos generar es apuntar al objeto. En este momento , this
necesitamos cambiar el apuntamientowindow
lucy
this
obj
this
setTimeout(obj.say.bind(obj),0); //martin,this指向obj对象
2. Diferencia:
- Los tres pueden cambiar
this
el objeto al que apunta la función. - El primer parámetro de los tres es
this
el objeto al que apuntar. Si no existe tal parámetro o el parámetro esundefined
onull
, apuntará al global por defecto.window
- Los tres pueden pasar parámetros, pero
apply
es una matriz,call、bind
pero una lista de parámetros,apply
ycall
la suma es un parámetro entrante único, perobind
se puede dividir en múltiples entrantes bind
es devolver la función después de vincular esto,apply
escall
ejecutar inmediatamente
3. Aplicar: apply
acepta dos parámetros, el primer parámetro es this
el puntero, el segundo parámetro es el parámetro aceptado por la función, la función original se ejecutará inmediatamente después de que se pase el cambio del puntero en forma de matrizthis
, y este método solo cambia temporalmente this
el puntero una vez
function fn(...args){
console.log(this,args);
}
let obj = {
myname:"张三"
}
fn.apply(obj,[1,2]); // this会变成传入的obj,传入的参数必须是一个数组;
fn(1,2) // this指向window
Cuando un parámetro es null
, el valor predeterminado apunta a (en el navegador)undefined
window
fn.apply(null,[1,2]); // this指向window
fn.apply(undefined,[1,2]); // this指向window
4. llamada: call
el primer parámetro del método también es el puntero, y this
luego se pasa una lista de parámetros.Laapply
función original se ejecutará inmediatamente después de cambiar this
el puntero, y este método solo cambia temporalmente this
el puntero una vez
function fn(...args){
console.log(this,args);
}
let obj = {
myname:"张三"
}
fn.call(obj,1,2); // this会变成传入的obj,传入的参数必须是一个数组;
fn(1,2) // this指向window
De manera similar, cuando el primer parámetro es null
, undefined
el valor predeterminado apunta a window
(en el navegador)
fn.call(null,[1,2]); // this指向window
fn.call(undefined,[1,2]); // this指向window
5.bind: el método bind es muy similar a la llamada. El primer parámetro también es el puntero, y this
luego se pasa una lista de parámetros (pero esta lista de parámetros se puede pasar varias veces). this
Después de cambiar el puntero, no se ejecutará inmediatamente, sino que devolverá una this
función que cambia permanentemente el puntero.
function fn(...args){
console.log(this,args);
}
let obj = {
myname:"张三"
}
const bindFn = fn.bind(obj); // this 也会变成传入的obj ,bind不是立即执行需要执行一次
bindFn(1,2) // this指向obj
fn(1,2) // this指向window
6. Resumen:
- La llamada a menudo hace herencia. **Object.prototype.toString.call()** Determinar el tipo de datos
- apply a menudo está relacionado con matrices, como la realización de los valores máximos y mínimos de una matriz con la ayuda de objetos matemáticos.
- bind no llama a la función, pero quiere cambiar este punto, como cambiar este punto dentro del temporizador.