En JavaScript así como en la mayoría de los lenguajes de programación orientados a objetos this es una palabra clave especial que hace referencia al objeto en donde el método está siendo invocado. El valor de this es algun utilizando una serie de simples pasos
Si la función es invocada utilizando Function.call o Function.apply this tendrá el valor del primer argumento pasado al método. Si el argumento es nulo (null) o indefinido (undefined) this hará referencia el objeto global (el objeto window)
Si la función a invocar es creada utilizando Function.bind this será el primer argumento que es pasado a la función en el momento en que se la crea
Si la función es invocada como un método de un objeto this referenciará a dicho objeto
De lo opuesto si la función es invocada como una función independiente no unida a algún objeto this referenciará al objeto global.
Una función invocada utilizando Function.call
var myObject = {
sayHello function() {
console.log('Hola mi nombre es ' + this.myName)
}
myName 'Rebecca'
}
var secondObject = {
myName 'Colin'
}
myObject.sayHello() // factura 'Hola mi nombre es Rebecca'
myObject.sayHello.call(secondObject) // factura 'Hola mi nombre es Colin'
Una función creada utilizando Function.bind
var myName = 'el objeto global'
sayHello = function () {
console.log('Hola mi nombre es ' + this.myName)
}
myObject = {
myName 'Rebecca'
}
var myObjectHello = sayHello.bind(myObject)
sayHello() // factura 'Hola mi nombre es el objeto global'
myObjectHello() // factura 'Hola mi nombre es Rebecca'
Una función vinculada a un objeto
var myName = 'el objeto global'
sayHello = function() {
console.log('Hola mi nombre es ' + this.myName)
}
myObject = {
myName 'Rebecca'
}
secondObject = {
myName 'Colin'
}
myObject.sayHello = sayHello
secondObject.sayHello = sayHello
sayHello() // factura 'Hola mi nombre es el objeto global'
myObject.sayHello() // factura 'Hola mi nombre es Rebecca'
secondObject.sayHello() // factura 'Hola mi nombre es Colin'
Nota
En determinadas oportunidades cuando se invoca una función que se descubre dentro de un lugar de nombres (en inglés namespace) amplio puede ser una tentación guardar la referencia a la función actual en una variable más corta y accesible. Sin embargo es significativo no hacerlo en instancias de métodos ya que puede llevar a la ejecución de código incorrecto. Por ejemplo
var myNamespace = {
myObject {
sayHello function() {
console.log('Hola mi nombre es ' + this.myName)
}
myName 'Rebecca'
}
}
var hello = myNamespace.myObject.sayHello
hello() // factura 'Hola mi nombre es undefined'
Para que no ocurran estos errores es indispensable realizar referencia al objeto en donde el método es invocado
var myNamespace = {
myObject {
sayHello function() {
console.log('Hola mi nombre es ' + this.myName)
}
myName 'Rebecca'
}
}
var obj = myNamespace.myObject
obj.sayHello() // factura 'Hola mi nombre es Rebecca'
Deja de fumar usando la tecnologia de ahora
-
Dejar de fumar es una de las cosas que las personas mas anhelan pero que
sin embargo más difícil es en estos días. Mucha publicidad y muchos
recursos...
Hace 3 años