Vejamos a explicação da chamada no MDN primeiro
O método Call () chama uma função ou método com um valor especificado e vários valores de parâmetros especificados.
NOTA: A função desse método é semelhante à do método Aplicação (), com apenas uma diferença, ou seja, o método Call () aceita uma lista de vários parâmetros, enquanto o método Aplicação () aceita uma matriz contendo vários parâmetros.
gramática
fun.call (thisarg [, arg1 [, arg2 [, ...]]]])
parâmetro
thisarg
Este valor especificado quando a função divertida está em execução. Deve -se notar que o especificado esse valor não significa necessariamente o valor real desse valor quando a função é executada. Se essa função estiver no modo não estrito, esse valor especificado como nulo e indefinido apontará automaticamente para o objeto global (o objeto de janela no navegador), e esse valor com o valor original (número, string, valor booleano) apontará para o objeto de embrulho automático do valor original.
arg1, arg2, ...
Lista de parâmetros especificados.
Os exemplos no MDN não eram fáceis de entender no início. Eu os postei aqui. Se você estiver interessado, pode conferir o Javascript de chamada.
Isso aqui é interpretado como esse valor especificado quando a diversão é executada, isto é, depois de usar a chamada, isso em diversão aponta para essearg? Olhe para o código
var p = "456"; função f1 () {this.p = "123"; } função f2 () {console.log (this.p); } f2 (); // 456 f2.Call (F1 ()); // 123 f2.Apply (F1 ()); // 123A primeira saída é a variável global chamada. Posteriormente, devido ao uso de chamada e aplicação, isso em F2 pontos para F1, para que a saída se torne 123. De fato, F1 toma empréstimo o método de F2 e produz seu próprio P
No momento, excluir isso.P em F1 () produzirá três 456, o que confirma que, quando isso é nulo ou indefinido, ele realmente aponta para a variável global.
Quanto ao objeto de embalagem que aponta para o valor original, pois os objetos de embalagem que eu entendo são temporários, e apenas o tipo de valor original é emitido durante o teste, em vez do objeto, como provar isso aqui se alguém sabe que pode discutir comigo se você espera que ele seja discutido comigo, obrigado!
Como a chamada pode implementar um objeto para emprestar outro objeto, ele pode implementar a herança? Olhe para o código
função f1 () {this.father = "pai"} função f2 () {f1.call (this); this.Child = "Child"; } var test = new f2 (); console.log (test.father); //paiNão há pai em teste, porque em f2 ()
f1.call (this);
Isso aqui aponta para F2, ou seja, F2 empresta o método da F1, que realmente realiza a herança.
Vamos falar sobre os parâmetros aqui. Os parâmetros aqui são passados para se divertir. Vamos ver o código
função f1 () {this.p = "123"; } função f2 (x) {console.log (this.p); console.log (x); } f2.Call (F1 (), 456); // 123 // 456A saída de 123 é porque P em F1 e o 456 subsequente é o parâmetro passado para F2, o que é fácil de entender.
Preste principalmente atenção à diferença entre os parâmetros na chamada e aplique
A chamada é passada em um por um, enquanto aplicação é uma matriz passada
função f1 () {this.p = "Chamada de teste"; } função f2 (x, y, z) {console.log (this.p); console.log (x); console.log (y); console.log (z); } função f3 () {this.p = "Teste Aplicar"; } f2.Call (F1 (), 4,5,6); f2.Call (F1 (), [4,5,6]); f2.Apply (f3 (), [4,5,6]); f2.Apply (F3 (), 4,5,6);Você pode ver os resultados aqui
A primeira chamada de teste é a saída correta
A segunda chamada de teste é passada em uma matriz, então uma matriz é a primeira saída e dois indefinidos
O terceiro teste de parágrafo aplica a saída correta
O quarto parágrafo relatou diretamente um erro devido ao erro no formato do parâmetro
A diferença aqui deve ser óbvia