função
Formato de função
função getPrototyNames (o,/*opcional*/ a) {a = a || []; para (var p in o) {a.push (p);} retorna a;}Chamador
func.caller retorna o chamador de função
function calfunc () {if (callfunc.caller) {alert (callfunc.caller.tostring ());} else {alert ("sem chamada de função");}} função handlecaller () {Callfunc ();} handleCaller ();callee
Método anônimo Chamada recursiva
alerta ((função (x) {if (x <=) retornar; retornar x * argumentos.callee (x -);} ())); //escopo
Todo mundo está familiarizado com o escopo. Hoje vou falar sobre o problema de fechamento e entender completamente o problema de fechamento.
<SCRIPT> var global = "Global Scope"; // Este é o escopo da função de escopo global () {var scope = "Local Scope"; // Este é o escopo do escopo local; // O escopo retornado é uma variável local} </sCript>1.: As variáveis globais definidas também podem ser acessadas dentro da função . Quando a variável local definida e o nome da variável global forem iguais, a variável local ocultará a variável global e não destruirá o valor da variável global.
var scope = "escopo global"; função f () {var scope = "Local Scope"; Scope Return;} Alert (f ()); // Scopealert local (escopo); // escopo global;O exposto acima é realmente fácil de entender, certo?
2. As variáveis globais podem ser declaradas sem VAR , mas as variáveis locais devem ser declaradas com var. Se as variáveis locais não usarem a declaração VAR, o compilador não será uma variável global.
<span style = "altura da linha: .; Fontra-família: Verdana, Arial, Helvetica, Sans-Serif; Substituto Px; Color de Fundo: RGB (,,);"> </span> Scope ("Global Scope"; Função F () {Scope = "Local Scope"; Return;No entanto, as variáveis globais não usam declarações VAR e estão disponíveis apenas para o modo não rigoroso. Se o modo rigoroso for usado, será relatado um erro.
<Cript> "Use Strict"; Scope = "Global Scope"; Função F () {Scope = "Local Scope"; Return Scope;} Alert (f ()); // Scopealert local (escopo); // Escopo local </sCript>Portanto, é recomendável que você não omite o VAR ao declarar variáveis, pois pode evitar problemas desnecessários.
3. Não há problema em declarar antecipadamente . O que está com antecedência.
<Cript> "Use Strict"; Scope; Console.log (SCOPE); var scope = "Global Scope"; Console.log (SCOPE); </script>
Isso pode ser visto como o primeiro a imprimir indefinido. Sim, ainda não recebeu um valor. A atribuição a seguir pode determinar o escopo global.
Isso não está errado, mas por que isso está acontecendo? Uma variável não deve ser definida antes que possa ser usada?
Aqui vou falar sobre a corrente de escopo. JavaScript é uma linguagem com escopo lexical.
1. Uma cadeia de escopo é um objeto ou lista vinculada. Esse conjunto de código define as variáveis "no escopo" deste código. Quando o JavaScript precisa encontrar o escopo variável, ele se desenvolverá e pesquisará a partir do primeiro objeto na cadeia. Se o primeiro objeto for escopo, o valor desse objeto será retornado diretamente. Se não existir, continuará pesquisando o segundo objeto até que seja encontrado. Se a variável não for encontrada na cadeia do escopo, um erro será lançado.
Podemos expressar essa cadeia de funções da seguinte forma: Encontre o escopo-> Window (objeto global) e, em seguida, o escopo é definido. No entanto, a operação de atribuição não foi realizada e a operação de atribuição foi realizada posteriormente, portanto o valor é indefinido no momento.
4. Isso é mais confuso. Qual é o valor impresso?
<SCRIPT> "Use Strict"; var scope = "global escopo"; função f () {console.log (escopo); var scope = "scope local"; console.log (escopo);} f (); </script>Veja este código: se você é descuidado, pode escrever a resposta errada:
1. Escopo Gobal
2. Escopo local
Análise: Declare variáveis globais. Quando no corpo da função, o primeiro representa a variável global, para que o global seja impresso e o segundo define variáveis locais, cobrindo o escopo global, portanto o escopo local é impresso.
Essa análise está completamente correta em C# Java. Mas a análise aqui está realmente errada.
Isso mostra que antes desse problema, vejamos primeiro uma pergunta.
Esta frase é muito importante: as variáveis globais são sempre definidas no programa. As variáveis locais são sempre definidas dentro do corpo da função que a declara e as funções que ela se anima.
Se você estiver trabalhando em um idioma de alto nível, estará sendo exposto ao JavaScript um pouco inadequado para sua definição de escopo. Eu sou o mesmo. Vamos dar uma olhada em um exemplo:
<Cript> var g = "Global Scope"; função f () {for (var i =; i <; i ++) {for (var j =; j <; j ++) {;} console.log (j);} console.log (i);} console.log (g); f (); </script>Qual é o resultado da impressão?
Você vê que {} representa um bloco de declaração e o bloco de declaração está no escopo do mesmo bloco, para que você possa adivinhar que os valores J e I foram liberados na memória, portanto o resultado deve ser indefinido.
O resultado real pode decepcioná -lo.
Por que isso aconteceu? Minha expressão começou como você.
Confira a frase que pedi para você se lembrar agora. . . As variáveis globais são sempre definidas no programa. As variáveis locais são sempre definidas dentro do corpo da função que a declara e as funções que ela se anima.
Para ser preciso, os parâmetros da função também pertencem à categoria de variáveis locais. Esta frase também é muito importante! ! !
Essa frase significa aproximadamente que, desde que uma variável definida dentro de uma função seja válida em toda a função. Portanto, o resultado não é difícil de entender. Olhando para a nossa pergunta, você entende?
A cadeia de ação também possui as seguintes definições:
1. A cadeia de ação é composta por um objeto global.
2. No corpo da função que não contém nidificação, existem dois objetos na cadeia de ação. O primeiro objeto define os parâmetros da função e as variáveis locais, e o segundo é o objeto global.
3. Em um corpo de função aninhada, existem pelo menos três objetos na cadeia de ação.
Quando uma função é definida, uma corrente de escopo será salva.
Quando essa função é chamada, cria um novo objeto para armazenar suas variáveis locais e adiciona esse objeto à cadeia de ação salva. Ao mesmo tempo, crie uma nova cadeia mais longa de funções que representam chamadas de função.
Para funções aninhadas, quando a função externa é chamada, a função interna será redefinida novamente. Como toda vez que uma função externa é chamada, a cadeia de ação é diferente. As funções internas têm diferenças sutis toda vez que são definidas. Cada vez que a função externa é chamada, o código da função interna é o mesmo e o escopo do código associado também é diferente.
Encerramento
Depois de fazer isso por tanto tempo, finalmente consegui falar sobre isso, mas vamos analisar o escopo antes.
<SCRIPT> var nameg = "global" var g = function f () {console.log (nome); function Demo () {console.log ("Demo =" + name);} var name = ""; function Demo () {var name = "; nameg);} Demo (); Demo (); Demo ();}; G (); </sCript>Analisamos de acordo com a cadeia de ação:
Call Demo0, Demo0 () -> Encontre o nome, não encontrado -> f (), retornar
Call Demo1, Demo1 ()-> Encontre o nome, encontre, retornar
Call Demo2, Demo2 () -> Encontre o nome, não encontrado -> f () para encontrar o nome, não encontrado -> Window para encontrar o nomeg, retornar.
Veja este exemplo:
<SCRIPT> função f () {var count =; return {contat: function () {return count ++;}, reset: function () {return count =;}}} var d = f (); var c = f (); console.log ("d firm chamado:"+ d.counter ()); Ligue para: "+ c.counter ()); // </sCript>Como você pode ver neste exemplo, fiz uma operação de contagem e zero.
Duas instâncias de objetos de F são criadas, cada uma com sua própria cadeia de escopo, portanto seus valores não se afetam. Quando C é chamado pela segunda vez, o valor da contagem é salvo porque o objeto C não é destruído. Somente depois de entender este exemplo, o exemplo a seguir será mais fácil de entender.
Todos devem ser muito claros sobre esse processo. Então agora vamos olhar para o problema de fechamento. Defino quatro botões e clico em cada botão para retornar o nome da resposta.
<Body> <Cript> função btninit () {for (var i =; i <; i ++) {var btn = document.getElementById ("btn" + i); btn.addeventListener ("clique", function () {alert ("btn" + i) <}); id = "btn"> btn </button> <button id = "btn"> btn </button> <button id = "btn"> btn </button> <button id = "btn"> btn </button> </div> </body>Clique para ser executado, mas o resultado é tudo BTN5;
Sentamos com a análise agora. Primeiro, precisamos chamar a função anônima -> encontrar i, não encontrado -> btninit () e encontrei i no loop for. virar para cima. Sabemos que apenas a chamada de função é lançada é lançada e o I para sempre é visível, então o último valor é retido. Então, como resolvê -lo.
Para resolver o problema de que o valor eu nem sempre é visível na função, precisamos usar o ninho da função e passar o valor que eu valoriza nela.
função btninit () {for (var i =; i <; i ++) {(function (data_i) {var btn = document.getElementById ("btn" + data_i); btn.adDeventListener ("click", function () {alert ("btn" + data_i);Olhando para o código modificado, primeiro execute o primeiro e crie um objeto. Primeiro, executamos a função anônima -> data_i, mas não encontramos -> função (data_i) e, em seguida, executamos novamente para criar um objeto. As regras de fechamento dizem que elas não se afetam. Portanto, o resultado correto pode ser obtido.
O exposto acima é o JavaScript Mather-Know Must-Know (9) Função que o editor apresenta a você. Falando do conhecimento relevante sobre questões de fechamento, espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!