Este é um objeto especial dentro da função. Isso se refere ao objeto de ambiente com base no qual a função é executada (faremos explicações adicionais no final do artigo). O valor disso não é certo antes de chamar a função. Diferentes métodos de chamada farão com que esse valor mude.
window.num = 22; var o = {num: 11}; função diznum () {alert (this.num)} saynum (); // 22o.saynum = saynum; o.saynum (); // 11Lembre -se: o nome da função é apenas uma variável que contém um ponteiro. Portanto, mesmo se executado em diferentes ambientes, a função Global Saynum () ainda é a mesma função que o.saynum ().
1. Ao chamar uma função no escopo global
Chamado no escopo global, esse objeto se refere à janela
A execução de funções anônimas é global, portanto, esse objeto geralmente aponta para a janela também.
função fn1 () {console.log (this);} fn1 ();2. Chamado através do novo operador
Isso faz referência a um objeto de instância
function pessoa (nome) {this.name = name;} person.prototype.printName = function () {alert (this.name); // byron}; var p1 = new Person ('byron');3. Método chama como objetos
Isso faz referência ao objeto
var obj1 = {nome: 'byron', fn: function () {console.log (this); }}; obj1.fn ();4. Chamada indireta
ligue e aplique
Cada função contém dois métodos não-herdados: Call () e Apply (). O objetivo desses dois métodos é chamar funções em um escopo específico, que é realmente equivalente a definir o valor desse objeto no corpo da função. Em outras palavras, a função é chamada diretamente e o ambiente de execução é especificado ao ligar
window.color = 'vermelho'; var o = {color: 'blue'}; função dizColor () {alert (this.color);} saycolor.call (this); // redsaycolor.call (janela); // Redsaycolor.call (o); // azul(1) Aplicar o método
Receba dois parâmetros, um é o escopo da função em execução na função e o outro é a matriz de parâmetros.
(2) Método de chamada
O método de chamada é o mesmo que o método de aplicação, a diferença é que o método de recebimento de parâmetros é diferente. Para o método de chamada, o primeiro parâmetro é que esse valor não mudou e a alteração é que os outros parâmetros são passados diretamente para a função.
função fn () {console.log (this) // função windwow iNnerfn () {console.log (this)} inerfn.call (this) // window} fn (); função fn0 () {console.log (this) // window} função fn1 () {fn0.call (this); console.log (this); // window} fn1 (); função fn0 () {console.log (this) // objeto} var o = {fn1: function fn1 () {fn0.call (this); console.log (this); // objeto}} o.fn1 ();5. Método Bind
Este método cria uma instância da função cujo valor está ligado ao valor passado para a função bind (). Ou seja, uma nova função será retornada e esta dentro da função será o primeiro parâmetro passado.
window.color = 'vermelho'; var o = {color: 'blue'}; função dizColor () {alert (this.color)} var objetosycolor = saycolor.bind (o); objetsaycolor (); // azulNota suplementar: Executar definição de ambiente
Define variáveis ou outros dados que as funções têm permissão para acessar. Cada ambiente de execução possui um objeto variável associado a ele. Todas as variáveis e funções definidas no ambiente são armazenadas neste objeto. O código que escrevemos não pode acessar esse objeto, mas o analisador o usará em segundo plano ao processar os dados.
1. Criação do ambiente de execução:
1. Ambiente de execução global
Em um navegador da web, o ambiente de execução global é considerado um objeto de janela, portanto, todas as variáveis e funções globais são criadas como propriedades e métodos do objeto de janela. Quando o código é carregado no navegador, o ambiente de execução global é criado (o ambiente de execução global é destruído apenas quando fechamos a página da web ou o navegador).
2. Ambiente de execução local
Cada função possui seu próprio ambiente de execução; portanto, o ambiente de execução local é um objeto de função. Quando uma função é chamada, o ambiente local da função é criado (depois que o código na função é executado, o ambiente é destruído e todas as variáveis e definições de função armazenadas nele também são destruídas).
Este ambiente de execução e objetos variáveis relacionados são um conceito abstrato, explicado da seguinte forma
var a = 1; função fn (num1, num2) {var b = 2; função fninner () {var c = 3; alerta (a + b + c); } fninner (); // criação de ambiente de execução local quando o fninner é chamado} fn (4,5); // criação de ambiente de execução local quando fn é chamado2. Corrente de escopo
A execução das funções JavaScript usa uma cadeia de escopo. Essa cadeia de escopo é criada quando a função é definida. Quando uma função é definida, ele realmente salva uma corrente de escopo. Quando essa função é chamada, cria um novo objeto para armazenar suas variáveis locais e adiciona esse objeto à cadeia de escopo salvo. A extremidade frontal da cadeia do escopo é sempre um objeto variável no ambiente em que o código atualmente executado está localizado. O final da cadeia do escopo é sempre um objeto variável do ambiente de execução global. O objetivo da cadeia de escopo é garantir que todas as variáveis e funções que tenham permissão para acessar o ambiente de execução tenham acesso a acessar.
var scope = 'Global Scope'; function checkScope () {var scope = 'Local Scope'; função f () {return scope}; retornar f;} checkScope () (); // Escopo localCompreensão: Quando o CheckScope é chamado, a função f é definida e ligada à cadeia de escopo de verificação como uma variável local. Portanto, não importa onde a função f seja chamada, essa ligação ainda é válida; portanto, o valor de retorno é o escopo local.
var num1 = 1; função externo () {var num2 = 2; console.log (num1 + num2); // 3 função interna () {// aqui você pode acessar o num3, num2, num1 var num3 = 3; console.log (num1 + num2 + num3); // 6} // Aqui você pode acessar num2, interno (), num1, mas não num3 interno ();} Outer (); console.log (num1); // 1, ambiente de execução // aqui você pode acessar apenas num1Cadeia de escopo (pesquisa UP): O ambiente interno pode acessar todos os ambientes externos através da cadeia de escopo, mas o ambiente externo não pode acessar nenhuma variável e funções no ambiente interno.
var name = 'byron'; função fn () {var name = 'csper'; console.log (nome); // casper} fn ();Quanto mais interno o ambiente, maior o peso variável.
Nota: as variáveis que não são declaradas diretamente com a palavra -chave VAR são variáveis globais. Por exemplo, se A = 1 for declarado diretamente, A é uma variável global no momento.
Quando o mecanismo Javscript entra no escopo, ele processará o código em duas rodadas. A primeira rodada, inicialize as variáveis. A segunda rodada, execute o código
var a = 1; função prisão (a) {console.log (a); // 1 var a; console.log (a); // 1} prisão (1);3. Execução da função
Quando uma chamada de função entra no ambiente de execução, o primeiro processo argumenta, inicialize os parâmetros formais (o valor padrão é indefinido) e inicialize a declaração de função na função. Quando o código é executado passo a passo, a declaração variável na função é inicializada (quando o código não é executado após a entrada do ambiente, o valor é indefinido). Portanto, a ordem de inicialização na função são parâmetros formais, declarações de função e declarações variáveis. Pode ser visto na imagem acima. Deixe -me dar um exemplo (todo o ambiente global também é uma função).
alerta (tipo de fn); // função, declaração de função alerta antecipadamente (typeof fn0); // declaração variável indefinida antecipadamente, mas não atribuída função fn () {// function expressão} var fn0 = function () {// função definição} alert (typeof fn0); // função, nisso