2011-06-18 9 views
17

Como se ha dicho aquí:Function.bind vs Closure en Javascript: ¿cómo elegir?

http://jqfundamentals.com/book/index.html

Los cierres también se pueden utilizar para resolver problemas con la palabra clave this, que es único para cada ámbito. Este mecanismo puede ser particularmente útil cuando se trata de devoluciones de llamada, aunque en esos casos, a menudo es mejor utilizar Function.bind, lo que evitará cualquier sobrecarga asociada con alcance traversal.

Pero realmente no dice cómo distinguir entre los dos casos. No entiendo de hecho lo que el autor quiere decir con "evitar cualquier sobrecarga asociada con el recorrido del alcance". ¿Puedes explicar?

+5

método de cierre parece ser dos veces más rápido http://jsperf.com/bind-vs-closure-performace – sbr

+2

El enlace está roto. "Lo siento, lo que está buscando no está aquí" – Luke

+0

@sbr 25 veces más rápido en mi computadora – Supersharp

Respuesta

9

Tome un vistazo a esta línea en el ejemplo en el enlace anterior

console.log(self.myName, this.myName); 

(con auto = presente; un par de líneas más arriba). El método de función outerfunction definido por el cierre existe en un ámbito diferente por lo que tiene un valor diferente del objeto outerObj. (self.myName! = this.myName)

Alcance transversal significa que cuando se está tratando de obtener un valor (variable, objeto) que existe en un ámbito diferente, se agrega una sobrecarga adicional (el código se vuelve más lento de ejecutar) .

Al usar bind, está llamando a una función con un alcance existente, para que no se produzca el recorrido del alcance.

+2

* el código se vuelve más lento de ejecutar * - esto es completamente incorrecto según lo indicado por el comentario de sbr y otras preguntas de SO: http://stackoverflow.com/questions/17638305/why-is-bind-slower-than-a-closure – adelphus

+0

Can usted proporciona más contexto en torno a la línea de código que ha agregado?El enlace proporcionado en la pregunta original ya no es válido. – Luke

+0

Además, puede proporcionar cualquier documentación o evidencia para explicar que "cuando está llegando para obtener un valor que existe en un ámbito diferente, se agrega una sobrecarga adicional". El control de rendimiento vinculado anteriormente por @sbr parece mostrar que el cierre es el mismo, incluso un poco más rápido. – Luke

7

Lo que se está refiriendo a son cosas como esta

obj.doSomething = function() { 
    var that = this; 
    setTimeout(function() { 
    // this is the window 
    // that is the obj 
    that.doSomethingElse(); 
    }, 50); 
}; 

vs

obj.doSomething = function() { 
    setTimeout((function() { 
    // this is the obj 
    this.doSomethingElse(); 
    }).bind(this), 50); 
}; 

Benchmark. No hay diferencia notable en cromo.

+0

Como las llamadas de función ocurren en microsegundos y setTimeout es de 10 milisegundos +, ¿no es esta falta de diferencia causada por la baja resolución de temporización de setTimeout? – jpillora

+0

Sí, pero ¿cuál de las dos se considera la mejor práctica (es decir, la "mejor lectura")? –

+0

@ LinusUnnebäck que se considera preferencia personal. Evito por completo usar 'this' en JavaScript ya que ambas variantes son feas. – Raynos

Cuestiones relacionadas