Antes de mencionar os conceitos acima, quero primeiro falar sobre os parâmetros implícitos das funções em JavaScript: argumentos
Argumentos
Este objeto representa os parâmetros da função que está sendo executada e da função que a chama.
[função.]argumentos[n]
Função de parâmetro: opções. O nome do objeto Function atualmente em execução. n: opção. O índice baseado em 0 do valor do parâmetro a ser passado para o objeto Function.
Descrição
Argumentos é um objeto oculto criado além dos parâmetros especificados ao chamar uma função. Argumentos é um objeto semelhante a um array, mas não um array. Diz-se que é semelhante a um array porque possui as mesmas propriedades e métodos de acesso de um array. n], e possui o atributo length do array length. Além disso, o objeto de argumentos armazena os parâmetros realmente passados para a função, não se limitando à lista de parâmetros definida pela declaração da função, e o objeto de argumentos não pode ser criado explicitamente. O objeto de argumentos está disponível apenas no início da função. O exemplo a seguir detalha essas propriedades:
//Uso do objeto de argumentos.
função ArgTest(a, b){
var i, s = "A função ArgTest esperada";
var numargs = argumentos.length; // Obtenha o valor do argumento passado.
var expargs = ArgTest.length; // Obtenha o valor do parâmetro esperado.
if (expargs <2)
s += expargs + " argumento. ";
outro
s += expargs + " argumentos. ";
se (numargs <2)
s += numargs + "foi aprovado.";
outro
s += numargs + "foram aprovados.";
s += "nn"
for (i =0; i < numargs; i++){ // Obtém o conteúdo do parâmetro.
s += " Arg " + i + " = " + argumentos[i] + "n";
}
return(s); //Retorna lista de parâmetros.
}
Adicionado aqui um código informando que argumentos não são um array (classe Array):
Array.prototype.selfvalue = 1;
alerta(new Array().selfvalue);
função testeAgumentos(){
alerta(argumentos.selfvalue);
}
Execute o código e você descobrirá que o primeiro alerta exibe 1, o que significa que o objeto array possui um atributo selfvalue com valor 1. Ao chamar a função testAguments, você descobrirá que "indefinido" é exibido, indicando que não é um atributo de argumentos. Ou seja, argumentos não é um objeto de matriz.
chamador
Retorna uma referência à função que chamou a função atual.
nomedafunção.caller
O objeto functionName é o nome da função executada.
Observe que para funções, o atributo chamador só é definido quando a função é executada. Se a função for chamada no nível superior, o chamador conterá nulo. Se o atributo chamador for usado em um contexto de string, o resultado será o mesmo que functionName.toString, ou seja, o texto descompilado da função será exibido.
O exemplo a seguir ilustra o uso do atributo caller:
// caller demo {
function callerDemo() {
if (callerDemo.caller) {
var a= callerDemo.caller.toString();
alerta(a);
} outro {
alert("esta é uma função superior");
}
}
função handleCaller() {
callerDemo();
}
callee
retorna o objeto Function que está sendo executado, que é o corpo do objeto Function especificado.
[função.]argumentos.callee
O parâmetro de função opcional é o nome do objeto Function que está sendo executado no momento.
Observe que
o valor inicial do atributo callee é o objeto Function que está sendo executado.
O atributo callee é um membro do objeto de argumentos. Ele representa uma referência ao próprio objeto de função, o que é benéfico para a recursão de funções anônimas ou para garantir o encapsulamento de funções. Por exemplo, o exemplo a seguir calcula recursivamente a soma de funções naturais. números de 1 a n. Esta propriedade só está disponível quando a função relevante está em execução. Deve-se notar também que o chamador possui um atributo de comprimento, que às vezes é melhor para verificação. argumentos.length é o comprimento real do parâmetro e argumentos.callee.length é o comprimento do parâmetro formal. A partir disso, você pode determinar se o comprimento do parâmetro formal é consistente com o comprimento real do parâmetro durante a chamada.
Exemplo
//callee pode imprimir a si mesmo
function calleeDemo() {
alerta(argumentos.callee);
}
//Usado para verificar parâmetros
function calleeLengthDemo(arg1, arg2) {
if (argumentos.length==argumentos.callee.length) {
window.alert("Verifique se os comprimentos dos parâmetros formais e reais estão corretos!");
retornar;
} outro {
alert("Comprimento real do parâmetro: " +arguments.length);
alert("Comprimento do parâmetro formal: " +arguments.callee.length);
}
}
//Cálculo recursivo
var soma = função(n){
se (n <= 0)
retornar 1;
outro
retornar n + argumentos.callee (n - 1)
}
Uma função recursiva mais geral:
var sum = function(n){
se (1==n) retornar 1;
senão retorne n + sum (n-1
Ao chamar: alert(sum(100));
A função contém uma referência à própria soma. O nome da função é apenas um nome de variável. Chamar sum dentro da função é equivalente a chamar uma variável global. Nesse caso, usar callee será um. comparação. Boa abordagem.
apply e call
servem para vincular uma função a outro objeto para operação. A única diferença entre elas é a forma de definir os parâmetros:
apply(thisArg,argArray)
; ;
Ou seja, ao ponteiro this dentro de todas as funções será atribuído o valor de thisArg, que pode atingir o objetivo de executar a função como um método de outro objeto.
A explicação de Apply
é que se argArray não é um array válido ou não é um argumento. objeto, isso causará um TypeError.
Se nem argArray nem thisArg forem fornecidos, o objeto Global será usado como thisArg.
e nenhum parâmetro pode ser passado.
Descrição da chamada
O método call altera o contexto do objeto de uma função do contexto inicial para o novo objeto especificado por thisArg.
Se o parâmetro thisArg não for fornecido, o objeto Global será usado como thisArg.
Dicas relacionadas:
Existe outro truque para aplicar call e apply. Ou seja, após usar call e apply para aplicar outra função (classe), a função atual ( classe) estarão disponíveis métodos ou propriedades de outra função (classe). Veja o exemplo a seguir:
// Demonstração de herança
função base() {
this.member = "dnnsun_Member";
este.método = função() {
janela.alert(este.membro);
}
}
função estender() {
base.call(este);
janela.alert(membro);
janela.alert(este.método);
}
Como pode ser visto no exemplo acima, extend pode herdar os métodos e propriedades de base após a chamada.
A propósito, apply é usado no protótipo da estrutura JavaScript para criar um padrão
que define uma classe. O código de implementação é o seguinte:
var Class = {.
criar: função() {
função de retorno() {
this.initialize.apply(isto, argumentos);
}
}
}
Análise: Do ponto de vista do código, este objeto contém apenas um método: Create, que retorna uma função, ou seja, uma classe. Mas este também é o construtor da classe, que chama inicializar, e este método é a função de inicialização definida quando a classe é criada. Desta maneira,
Você pode implementar o exemplo do modo de criação de classe em protótipo
:
var Vehicle=Class.create();
veículo.prototype={
inicializar:função(tipo){
this.type=tipo;
}
mostrarSelf:função(){
alert("este veículo é "+ this.type);
}
}
var moto=novo veículo("Moto");
moto.showSelf();
Para informações mais detalhadas sobre o protótipo, visite seu site oficial.
http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html