• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

158
Views
Cómo envolver y llamar correctamente a una función en un objeto

Después de muchas horas buscando una explicación y fallando, lo pregunto aquí.

Todo el código aquí son ejemplos hechos de lo que estaba trabajando.

Primer enfoque

objeto sencillo:

 let obj = { fun: window.getComputedStyle, ele: $('#myDiv')[0] };

Al intentar la siguiente llamada de función:

 obj.fun(obj.ele);

Da el siguiente error:

 Uncaught TypeError: 'getComputedStyle' called on an object that does not implement interface Window.

Estoy usando jQuery para recuperar el elemento JS, pero usar document.getElementById produciría el mismo resultado.

Segundo enfoque

Busqué durante un tiempo sobre diferentes tipos de objetos y encontré este estilo:

 let obj = { fun: function() {return window.getComputedStyle}, ele: $('#myDiv')[0] };

Pero este tipo debe llamarse de otra manera:

 obj.fun()(obj.ele);

Este enfoque funciona correctamente.

Pregunta

Obviamente, la versión ampliada del código funciona según lo previsto:

 window.getComputedStyle($('#myDiv')[0]);

El código anterior devuelve el objeto completo correctamente.


Entonces mis preguntas son:

  • ¿Por qué falla el primer enfoque (que tiene más sentido para mí)?
  • ¿Hay alguna forma de corregir el primer enfoque, de modo que pueda usar el primer tipo de llamada de función?
  • ¿No se supone que se debe hacer este tipo de ajuste de función?

¡Gracias!

about 3 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Cuando llama al método obj.fun() , está llamando a getComputedStyle con el alcance obj (this value) y no con el alcance global (this/window/globalThis).


Hay varias formas de corregir este comportamiento particular:

Primera solución

Puede hacer uso de una función, como las funciones de flecha y definir fun-property siguiente manera:

 fun: (e) => window.getComputedStyle(e)

Vea un fragmento de trabajo a continuación:

 let obj = { fun: (e) => window.getComputedStyle(e), ele: $('#myDiv')[0] }; console.log(obj.fun(obj.ele));
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="myDiv"></div>

Segunda solución

Puede hacer uso de Function.prototype.bind para acceder al contexto correcto en la invocación de la función usando este código:

 fun: window.getComputedStyle.bind(this)

Ver un fragmento de trabajo:

 let obj = { fun: window.getComputedStyle.bind(this), ele: $('#myDiv')[0] }; console.log(obj.fun(obj.ele));
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="myDiv"></div>

about 3 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error