Pergunta

Eu tenho feito um pouco de pesquisa para isso, mas parece que os métodos utilizados são inconsistentes e variada.

Aqui estão alguns métodos que usei no passado:

/* 1: */  typeof myFunc === 'function'
/* 2: */  myFunc.constructor === Function
/* 3: */  myFunc instanceof Function

Como parte de minha pesquisa, eu tinha um olhar como de algumas bibliotecas feito isso:

 /* jQuery 1.2.6: */  !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test( fn + "" )
 /* jQuery 1.3b1: */  toString.call(obj) === "[object Function]"
/* Prototype 1.6: */  typeof object == "function"
      /* YUI 2.6: */  typeof o === 'function'

Eu estou espantado há tantos métodos diferentes de seres utilizado, certamente uma única aceitável de teste tiver sido acordado?E eu estou completamente sem noção do que sejam as intenções com jQuery 1.2.6 rendição, parece um pouco OTT...

Então, a minha pergunta permanece, qual é a melhor* forma de teste para uma função?

Eu também aprecio alguns visão sobre alguns dos métodos acima, especialmente jQuery 1.2.6 s.(Eu posso ver o que eles estão fazendo, apenas parece estranho)

[*] Por 'melhor', eu quero dizer o mais amplamente aceito cross-browser compatível método.


EDITAR:Sim, eu sei que foi discutido antes, mas eu ainda gostaria de um pouco de discussão sobre o método mais eficaz.Por que existem tantos diferentes métodos utilizados?

As discussões sobre a assim até agora ter mencionado apenas o operador typeof (principalmente), mas ninguém deu a entender que a eficácia de métodos alternativos.

Foi útil?

Solução

A melhor maneira de testar se um objeto é uma função é typeof myFunc === 'function'.Se você estiver usando uma biblioteca, use a biblioteca do teste de função: jQuery.isFunction(myFunc).

Coisas pode ser incorrectamente como funções quando utilizar typeof.Isso é muito raro, mas uma biblioteca existe para remover essas inconsistências.jQuery trabalho em torno destas questões:

  • O Firefox de relatórios com typeof document.createElement("object")
  • Safari de relatórios com typeof document.body.childNodes
  • Versões antigas do Firefox relatado expressões regulares como funções (este não é o caso em 3.0).
  • Algumas IE construído em funções globais (alert) e alguns métodos do node (getAttribute) são relatados para ser do tipo de "objeto".

Usando instanceof em vez de typeof contorna alguns destes.Por exemplo, document.createElement("object") instanceof Function é false no Firefox.

Você pode ver o nascimento do primeiro método nos comentários para o bilhete original (#3618).O novo método é de changeset 5947 e parece ter sido inventado por Resig para resolver IE vazamentos de memória.Provavelmente é mais lento, mas menor e mais limpo.

Não há muita diferença entre == e === aqui em termos de como as coisas funcionam, mas a avaliação rigorosa é sempre tão ligeiramente mais rápido e, portanto, preferível.

Outras dicas

John Resig o programador de jQuery não parece ter feito algumas escolhas bizarras no interior do jQuery.

toString.call(obj) === "[object Function]"

parece muito limpo, mas eu não consigo pensar em qualquer situação onde o acima seria verdadeiro, onde os simples typeof abordagem falhar, mas, talvez, ele sabe de algo que o resto de usar não.

typeof o === "function"

Eu iria com o último, pois tem uma maior clareza, a menos que você tenha fortes evidências de que isso não vai funcionar.

Por que usar estrita igualdade no typeof desde que ambos os operandos forem seqüências de caracteres?Eu sou vista sobre algum problema?

De qualquer maneira, gostaria de ir a maneira mais simples de typeof, que parece ser feito para que e é legível. instanceof é muito legível, mas parece insistir mais no fato de que uma função é um objeto, que pode ser irrelevante para o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top