Como começar rapidamente com VUE3.0: Aprenda
Nas várias introduções que vimos sobre como determinar o método de apontar isso, a frase "isto aponta para o objeto que o chama" é considerada o. núcleo, mas diante de Tendemos a ficar confusos sobre uma variedade de situações. Com base na minha compreensão de várias situações, apresentei uma frase : "Setas, tempo e estrutura, olhe para situações especiais, olhe para o número do ponto para chamadas comuns, não olhe para a frente para os pontos posteriores, e então julgue baseado no princípio mais próximo, e a última coisa que resta é a janela." .
Função de seta
A função de seta em si não possui this, portanto não há essa alteração. Ela captura o this externo usando
var name = "windowsName"; var a = { nome: "Cereja", fn() { setTimeout(()=>{ console.log(este.nome); },0) } } a.fn() //Análise cereja
: Primeiro, o objeto a chama a função fn, então this da função fn aponta para o objeto a, e então a seta captura o this externo, então não é this em setTimeout, mas this de a função fn, portanto, no final, obtenha o nome no objeto a
O timer
é this da função de retorno de chamada dentro da função de atraso aponta para a janela do objeto global
var name = "windowsName"; var a = { nome: "Cereja", fn() { setTimeout(função(){ console.log(este.nome); },0) } } a.fn() //análise windowsName
: Primeiro, o objeto a chama a função fn e, em seguida, a função de retorno de chamada em setTimeout aqui é uma função anônima, que é uma função comum. Então, isso na função anônima aponta para window
var name =. "nomejanelas"; var b={ nome: "setTimeoutName" } var a = { nome: "Cereja", fn() { setTimeout((função(){ console.log(este.nome); }).bind(b),0) } } a.fn() //análise setTimeoutName
: Primeiro, o objeto a chama a função fn e, em seguida, a função de retorno de chamada em setTimeout aqui é uma função anônima, que é uma função comum. Então, isso na função anônima aponta para a janela, mas. use bind para alterar a função anônima. Isso aponta para o objeto b, então o nome
construtor
no objeto b finalmente aponta para o objeto de instância criado no construtor.
Nota: Se um objeto for retornado no construtor, não haverá nova instância. objeto quando criado, mas este O objeto retornado pela
função fn(){ esta.idade = 37; } var a = new fn(); console.log(a.idade); a.idade = 38; console.log(fn); // { this.age = 37; console.log(a.age); // 38
Análise: Aqui criamos o objeto de instância a através do construtor, o que equivale a abrir um novo local e copiar o conteúdo do construtor. vez, isso aponta para o objeto a, nossa modificação do conteúdo no objeto a não afeta a aprovação do
julgamento do número
de ponto do construtor.
Julgue este ponto e siga o princípio de proximidade
var a = {. idade: 10, b: { idade: 12, fn(){ console.log(esta.idade); } } } abfn(); //12
Análise: O objeto a chama a função fn do objeto b. Existem dois na frente da função fn .
Então o mais próximo é o objeto b, então este da função fn aponta para o objeto b. a última coisa obtida é a idade do objeto b
var a = {.
idade: 10, b: { idade: 12, fn(){ console.log(this.age); //indefinido } } } varc = { idade:20, } var d = { idade:30, } abfn.bind(c).bind(d)(); //20
análise: O objeto a chama .
função fn do objeto b e então usa bind para mudar a direção disso. independentemente do anterior .
basta olhar para trás e, em seguida, a ligação mais recente altera esse ponto para c, então esse ponto da função fn é o objeto c, e o que você obtém é a
de prática
de idadeouterFunc() {do objeto c
console.log(este) // { x: 1 } função função() { console.log(this) //Janela } diversão() } outerFunc.bind({ x: 1 })()
obj = { função() { const arrowFunc = () => { console.log(este._nome) } seta de retornoFunc }, _nome: "obj", } obj.func()() //obj func = obj.func func()() //indefinido obj.func.bind({ _name: "newObj" })()() //newObj obj.func.bind()()() //indefinido obj.func.bind({ _name: "bindObj" }).apply({ _name: "applyObj" })() //bindObj
Use as funções apply, call e bind para alterar a direção de
.this. O acima this
A diferença entre
thisArg , [ argsArray]
call(thisArg, arg1, arg2, ...)
A diferença entre as funções apply e call está nos parâmetros passados após isso. em apply é um array, e o que é passado em call É o parâmetro expandido
bind(thisArg[, arg1[, arg2[, ...]]])()
primeiro
this
bind()
e os parâmetros restantes serão usados como parâmetros da nova função para uso ao chamar.! Obrigado a todos pela leitura!
Material de referência
https://juejin.cn/post/6946021671656488991#comment
[Recomendações de tutoriais em vídeo relacionados: front-end da web]
O texto acima é como você pode entender esse problema apontador de JS? Dê uma olhada nos detalhes deste artigo. Para obter mais informações, preste atenção a outros artigos relacionados no site php chinês!