Em JavaScript, esse apontamento é alterado dinamicamente e é muito provável que esse apontamento seja destruído acidentalmente durante o processo de redação de um programa. Portanto, precisamos de uma tecnologia que possa corrigir o significado disso, para que tenhamos três métodos: chamar, aplicar e vincular para alterar o apontamento disso dentro do corpo da função, porque a função tem os conceitos de "contexto de definição", "contexto de tempo de execução" e "contexto pode ser alterado"
Aplique, ligue
Aplicar: aplique um método de um determinado objeto e substitua o objeto atual por outro objeto
Ligue para: ligue para um método de um objeto para substituir o objeto atual por outro objeto
function Person () {} Person.prototype = {att: {Age: 18, Sex: 'Girl'}, digamos: function () {console.log ("minha idade é" + this.attr.age); console.log ("Eu sou um" + this.attr.sex); }} var marry = new Person (); Marry.Say (); // minha idade tem 18 anos // eu sou uma garotaMude a direção
function Person () {} Person.prototype = {att: {Age: 18, Sex: 'Girl'}, digamos: function () {console.log ("minha idade é" + this.attr.age); console.log ("Eu sou um" + this.attr.sex); }} xiaoming = {att: {idade: 20, sexo: 'garoto'}}; var marry = new Pessoa (); Marry.Say (); Casar.say.call (xiaoming); // minha idade tem 18 anos // eu sou uma garota // minha idade tem 20 anos // eu sou um meninoO que é comum
Ambos podem ser usados para chamar um método em vez de outro objeto, alterando o contexto do objeto de uma função do contexto inicial para o novo objeto especificado por ThisObj.
A diferença
1. Aplique: Só pode haver dois parâmetros no máximo - o novo objeto e um argary da matriz. Se você passar vários parâmetros para esse método, escreva todos os parâmetros nessa matriz. Obviamente, mesmo que exista apenas um parâmetro, ele deve ser escrito na matriz. Se o Argarray não for uma matriz válida ou não for um objeto de argumentos, um TypeError será gerado. Se nenhum argumento for fornecido, o objeto global será usado como thisObj e não puder ser transmitido por nenhum argumento.
fun.call (thisarg [, arg1 [, arg2 [, ...]]]) função f (x, y) {console.log (x+y);} f.call (null, 1, 1) // retornar 22. Chamada: é uma lista de parâmetros diretos, que é usada principalmente quando vários métodos do objeto JS são chamados um para o outro, para que o ponteiro atual permaneça consistente ou, em casos especiais, esse ponteiro precisa ser alterado. Se o parâmetro ThisOBJ não for fornecido, o objeto global será usado como thisObj.
Fun.Apply (thisArg, [argSarray]) função f (x, y) {console.log (x+y);} f.call (null, [1,1]) // retorna 2Aplicar é o mesmo que a função de chamada, exceto que a lista de parâmetros de entrada é diferente no formulário. Estearg é o contexto que você deseja especificar. Pode ser qualquer objeto JavaScript (tudo no JavaScript é um objeto). A chamada precisa passar os parâmetros em ordem, enquanto aplica os parâmetros em uma matriz.
Se o número de parâmetros de uma função não for corrigido, use a chamada quando seus parâmetros souberem claramente a quantidade e o uso se aplicará quando for incerto e, em seguida, empurre o parâmetro para a matriz e passe -o. Quando o número de parâmetros for incerto, a função também pode atravessar todos os parâmetros através da matriz de argumentos. Vamos dar uma olhada em algum uso
Código 1
var Array1 = [12, "Foo", {Nome: "Joe"}, -2458]; var Array2 = ["Doe", 555, 100]; Array.prototype.push.apply (Array1, Array2); Console.Log (Array1);Código dois
Var Numbers = [5, 458, 120, -215]; Math.Max.Apply (NULL, Numbers); // 458
Código três
log (12, "foo", {name: "joe"}, -2458); função log () {var args = array.prototype.slice.call (argumentos); args.unShift ('(app)'); console.log.apply (console, args);}; // (app) 12 foo objeto {name: "joe"} -2458vincular
fun.bind (thisarg [, arg1 [, arg2 [, ...]]]])
Ao contrário do acima, o BIND retornará uma nova função que altera esse apontamento. Observe que a nova função é enfatizada aqui, que não é o mesmo endereço de memória usado antes; portanto, quando você precisa reutilizar essa função, você deve salvá -lo em uma variável para facilitar a próxima chamada. As duas funções acima são os resultados da execução retornados, ou seja, a chamada é executada.
A linha, além disso, outra coisa a observar é que o primeiro parâmetro na função de ligação se tornará automaticamente o valor padrão para retornar os parâmetros na nova função. Então, quando a chamada oficial é chamada, você só precisa fornecer os parâmetros restantes, exceto o primeiro parâmetro.
função f (x, y) {console.log (x+y);} f.call (null, [1,1]) var new_f = f.bind (null, 1,1) // retorna new functionNew_f (1) // retornar 2Deve -se notar que o parâmetro thisArg em todos os códigos de exemplo acima é substituído pelo NULL. Quando este objeto não é especificado, este apontador é um objeto global sob nulo e indefinido, ou seja, o ambiente de execução de código JS
Aplicar, ligar, comparar a comparação
var obj = {bar: 'oops, esta é uma má idéia'}; var foo = {get: function () {return this.bar; }} var bind = foo.get.bind (obj), call = foo.get.call (obj), apply = foo.get.apply (obj); console.log (bind (), ligue, aplique); console.log (Bind, Call, Apply); console.log (tipoof bind, tipoof chamada, tipo de aplicação); console.log (typeof bind (), tipoof chamada, typeof aplicar);Não vejo diferença. A diferença é que, quando você deseja alterar o contexto, ele não é executado imediatamente, mas o retorno de chamada é executado, use o método bind (). Aplicar/chamada executará a função imediatamente
Aplicar, chamar, vincular são todos usados para alterar o apontamento desse objeto da função; Os primeiros parâmetros de aplicação, chamada, ligação são todos objetos aos quais isso deve apontar, ou seja, o contexto a ser especificado; Aplicar, ligar, vincular pode usar parâmetros subsequentes para passar os parâmetros; vincular retorna a função correspondente, que é conveniente para ligar mais tarde; Aplicar, a chamada é chamada imediatamente
O artigo acima entende profundamente a diferença entre chamadas, aplicar e vincular métodos no JavaScript é todo o conteúdo que compartilho com você. Espero que possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.