A primeira vez que traduzi um artigo técnico, ri de você!
Texto original traduzido:
Function.Apply and Function.Call in JavaScript
O primeiro parágrafo é omitido.
Cada função JavaScript possui muitos métodos anexados, incluindo ToString (), Call () e Apply (). Parece que você achará estranho que uma função tenha seus próprios métodos, mas lembre -se de que todas as funções no JavaScript são um objeto. Dê uma olhada neste artigo e revise os recursos JavaScript (Refrescador). Você também pode saber a diferença entre funções e métodos no JavaScript. Eu acho que a descrição das "funções" e "métodos" é apenas uma convenção habitual de JavaScript. As funções são baseadas em si mesmas (por exemplo: alert ()), e os métodos são os atributos de um objeto dentro da função (dicionário) e chamamos métodos através de objetos. Cada objeto JavaScript possui um método ToString (). A seguir, é apresentado um exemplo do código. Em um objeto de função, podemos usar o método ToString ().
function foo () {alert ('x');} alert (foo.toString ());Como as funções são objetos, eles têm suas próprias propriedades e métodos. Podemos pensar neles como dados. Neste artigo, focamos apenas os métodos de duas funções Aplicar () e Call ().
Vamos começar com o seguinte código:
var x = 10; função f () {alert (this.x);} f ();Definimos uma função global f (). f () acessa a variável x através dessa palavra -chave, mas deve -se notar que não podemos chamar essa função através de uma instância de um objeto. Em que objeto isso aponta? Isso apontará para esse objeto global. Nossa variável x é definida neste objeto global. O código acima pode ser executado normalmente. O resultado em execução exibirá uma caixa de diálogo e 10 é exibido na caixa de diálogo.
Podemos chamar Call () e Aplicar () através disso. Como o exemplo a seguir mostra como usar Call ():
var x = 10; var o = {x: 15}; função f () {alert (this.x);} f (); f.call (o);Primeiro, a chamada f () exibirá a caixa de diálogo de 10, porque esse ponto para o objeto global no momento. Em seguida, chamamos o método Call () da função f, o parâmetro passado é O, e o resultado da execução mostra o valor do atributo x em O 15. O método Call () usará seu primeiro parâmetro como este ponteiro para a função f. Ou seja, diremos ao tempo de execução qual objeto isso na função f aponta.
Esse salto parece um pouco engraçado, e é até anomalia para programadores C ++, Java e C#. Todas essas são partes interessantes do ECMAScript.
Você também pode passar os parâmetros para a função através da chamada ():
var x = 10; var o = {x: 15}; função f () {alert (this.x);} f (); f.call (o);Aplicar () e Call () são semelhantes, exceto que o aplicativo () exige que o segundo parâmetro deve ser uma matriz. Essa matriz será passada como um argumento para a função de destino.
var x = 10; var o = {x: 15}; função f (message) {alert (mensagem); alerta (this.x);} f ('invocando f'); f.Apply (o, ['Invocando f através da aplicação']);O método Aplicar () é útil porque podemos criar uma função sem se preocupar com os parâmetros do método de destino. Esta função pode passar parâmetros adicionais para o método através do segundo parâmetro de matriz de Aplicar ().
var o = {x: 15}; função f1 (message1) {alert (message1 + this.x);} função f2 (message1, message2) {alert (message1 + (this.x * this.x) + message2);} função g (objeto, o, o f) {func. f2, ['o valor de x quadrado =', '.Há algo errado com esta sintaxe. Para chamar o método Aplicar (), forçamos a função objetivo a usar os parâmetros na matriz. Felizmente, existe uma maneira de facilitar essa sintaxe. Antes disso, devemos primeiro introduzir um: identificador de parâmetros.
No JavaScript, cada função realmente possui uma lista de parâmetros de comprimento de variável. Isso significa que, mesmo que uma função tenha apenas um parâmetro, podemos passar 5 parâmetros para ela. O código a seguir não terá nenhum erro e o resultado mostra "H".
função f (message) {alert (mensagem);} f ('h', 'e', 'l', 'l', 'o');Em f (), se não queremos aceitar outros parâmetros, podemos usar os argumentos das palavras -chave. Os argumentos representam um objeto de argumento, que possui um atributo representando comprimento semelhante a uma matriz.
função f (message) {// O valor da mensagem é o mesmo que argumentos [0] para (var i = 1; i <argumentos.length; i ++) {message+= argumentos [i]; } alert (mensagem);} // O resultado mostra "hello" f ('h', 'e', 'l', 'l', 'o');Você deve saber que, estritamente falando, os argumentos não são uma matriz. Os argumentos têm um atributo de comprimento, mas não há métodos de divisão, push e pop. Na função G () anterior, podemos copiar os parâmetros necessários dos argumentos, formar uma matriz e depois passar essa matriz para aplicar ().
var o = {x: 15}; função f (message1, message2) {alert (message1 + (this.x * this.x) + message2);} função g (objeto, func) {// argumentos [0] = objeto // argumentos [1] = funcl var args = []; for (var i = 2; i <argumentos.length; i ++) {args.push (argumentos [i]); } func.apply (objeto, args);} g (o, f, 'o valor de x quadrado =', '. uau!');Quando chamamos G (), podemos passar argumentos adicionais como parâmetros em vez de encher os argumentos em uma matriz.