Eu usei isso durante a entrevista há alguns dias. O entrevistador disse que meu entendimento era um pouco tendencioso. Voltei para ler o livro e alguns blogs e fiz alguns testes. Descobri que meu entendimento estava realmente errado.
1. Variáveis globais
Deve ser o mais comumente usado. Chame isso na função, e essa é realmente uma variável global
var value = "0"; function mei () {var value = "1"; console.log (this.value); // 0 console.log (valor); // 1} mei ();A saída é 0 porque isso aponta para o global
2. Construtor
Este é o uso com o qual estou mais familiarizado. Use isso no construtor. Após um novo objeto, isso aponta para esse novo objeto.
var value = "janela"; função mei () {this.value = 1; this.show = function () {console.log (this.value)}} var m = new mei (); console.log (M.Value); // 1 M.Show (); // 1Você pode ver que a saída é 1 em vez de janela. Pode -se observar que, devido ao construtor, isso aqui apontou para um novo objeto em vez de uma variável global.
3. Ligue e aplique
Pegue emprestado os exemplos da minha chamada e aplique o blog diretamente
var p = "456"; função f1 () {this.p = "123"; } função f2 () {console.log (this.p); } f2 (); // 456 f2.Call (F1 ()); // 123 f2.Apply (F1 ()); // 123A saída da primeira linha é fácil de entender. Isso aponta para o global. O 123 é porque, após o uso da chamada ou aplicação, isso em F2 pontos para F1 e P em F1 é 123. Clique na postagem do blog para obter detalhes.
4. A função é chamada de método de um objeto (onde cometi um erro)
Naquela época, me pedi para escrever um objeto com vários métodos. Definei uma variável global em minha mente e depois chamei isso no método do objeto. O entrevistador me perguntou o que é isso? Eu disse que deveria ser janela, porque usei muito pouco esse método e achei que apenas nova ou chamada mudaria a direção disso, então ele disse que estava errado e me pediu para voltar e ver eu mesmo. Agora eu tentei, estou realmente errado. Publique o código
var value = "pai"; function mei () {} mei.value = "filho"; mei.get = function () {console.log (this.value)}; mei.show = function () {console.log (value)}; Mei.get (); // criança mei.show (); //paiComo o get é chamado como um método de Mei, isso aqui aponta para Mei.Value So Output Child
Quanto ao pai, eu entendo dessa maneira. A função apontada pelo show é definida no ambiente global. Devido à cadeia do escopo, nenhum valor é encontrado no programa, então defino o ambiente dele e o encontro. Isso encontra o valor global. Se houver um erro no entendimento aqui, espero que um amigo possa apontar!