Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jair Humberto

como passar parametros para um função "sem nome"?

Recommended Posts

Olá pessoal. Como faço para passar parametros para uma função que é um "valor" de objeto?

tipo:

 

String.prototype.nome = function() {
    // como passar parametros para cá?
}

:\

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

é, isso mesmo.

 

Mas como eu recupero os parametros de dentro da função? :/

estou tentando enviar alguns dados via ajax assim:

 

type = "teste"
// essa variavel type é uma string, e não consigo recuperar de dentro da função
ajax.onreadystatechange = function(type) {
    if(ajax.readyState == 4) {
        alert(type) // dá undefined :\
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não está no método "nome" que você adicionou à classe String, na verdade você nem chamou ele.

A onreadystatechange é um evento disparado pela mudança de estado de uma requisição AJAX. Quem passa os parametros para a função não é você, mas sim o objeto de requisição assíncrona que você criou.

Portanto ao utilizar a dessa forma você na verdade criou uma nova variável "type" cujo escopo é apenas a função onreadystatechange:

 

type = "teste"; // Escopo global
ajax.onreadystatechange = function(type) { // <-- Note que você criou um parametro com o mesmo nome da variável
    if(ajax.readyState == 4) {
        alert(type); //<-- Esse teste é o parametro que você criou, porque tem escopo local, e não a variável declarada fora da função,
                     //      como a função onreadystatechange não utiliza parametros "type" será sempre undefined
    }
}

A variavel "type" que você inicializou com o valor de "teste" não estará disponível dentro da função onreadystatechange porque ela tem o mesmo nome que a outra variavel.

A função onreadystatechange também não possui parametros, para obter o valor retornado pela requisição assíncrona voce deve utilizar:

 

type = "teste";
ajax.onreadystatechange = function() {
    if(ajax.readyState == 4) {
        alert(ajax.responseText); // Valor retornado pela requisição
        alert(type); // Valor da variavel "teste" (Agora ela fica disponível porque foi removido o parametro "type" cujo escopo era local
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Francis Schiavo,

 

Obrigado por responder, mas a variavel estará com escopo local ou global? Eu vou enviar diversas vezes requisições via ajax,

então se for escopo global creio que dará problemas né?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em geral é desnecessário o uso de variáveis globais quando se utiliza AJAX. Claro que depende da informação que você está armazenando nessa variável.

Poste exatamente o que você precisa fazer para que possamos analizar a melhor forma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Antes de mais nada obrigado pelas respostas.

Sobre o post, eu tenho esse problema em quase todos os meus scripts em que uso ajax ou qualquer outra "função sem nome"

 

Vou dar um exemplo na teoria:

 

/* esta função será usada para solicitar que o servidor execute determinadas operações e me retorne o resultado.
Há três possibilidades de operações: a, b e c, então eu tenho o parametro modo para enviar para o servidor.*/
function conecta(modo) {
    var ajax = retornaHttpObject()
    ajax.open('POST', 'servider/manager', true)
    ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")

    // passo a variavel para o servidor
    ajax.send('modo='+modo)

    /* agora quero passar o parametro modo para dentro da funcao abaixo de forma que o retorno
    do servidor seja tratado de acordo com a modalidade */
    ajax.onreadystatechange = function() {
        if(ajax.readyState == 4) {
            trata_retorno(ajax.responseXML, modo)
        }
    }

}

O que acontece, nesse caso, é que essa função será executada diversas vezes, e poderá ser executada para uma nova tarefa durante a execução de outra, e como o processo é assincrono, fica a pergunta sobre o estado da variavel modo, isto é, o seu valor, durante todas as execuções, pois se a variavel for global, a alteração de seu estado irá afetar outras execuções da mesma função.

 

Esse é só um exemplo, mas essa necessidade se estende a muito outros pontos.

 

Edit: não sei se estou certo, mas analisando agora novamente, parece que a variavel modo estará no escopo local da função conecta, se for correto, não haverá problemas

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.