ES6类中的javascript’the’返回undefined

前端之家收集整理的这篇文章主要介绍了ES6类中的javascript’the’返回undefined前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > How to access the correct `this` inside a callback?8个
我认为这是一个范围问题,但我不知道如何解决这个问题.
这是我的代码http://jsfiddle.net/9k9Pe/1498/
  1. class FrameCreator{
  2.  
  3. constructor(){
  4. this.createFrame();
  5. }
  6. createFrame(){
  7. var iframe = document.createElement('iframe');
  8. this.iframe = iframe;
  9. var frameLoaded=this.frameLoaded;
  10. iframe.onload = function () {
  11. frameLoaded();
  12. };
  13. document.body.appendChild(iframe);
  14. }
  15. frameLoaded(){
  16. console.log("frame loaded");
  17. }
  18. }
  19.  
  20. class CustomFrameCreator extends FrameCreator{
  21. addContent(){
  22. console.log(this); // returns the object
  23. }
  24. frameLoaded(){
  25. console.log(this); // returns undefined
  26. }
  27. }
  28.  
  29. var frame=new CustomFrameCreator();
  30. frame.addContent();

frameLoaded()打印undefined,而addContent打印对象.

如何解决这个问题,所以我可以在加载框架时有一个参考?

谢谢

解决方法

.bind()的另一个替代方法是使用ES6 Arrow函数来保留上下文:
  1. iframe.onload = () => {
  2. this.frameLoaded();
  3. };
  1. class FrameCreator {
  2. constructor() {
  3. this.createFrame();
  4. }
  5. createFrame() {
  6. var iframe = document.createElement('iframe');
  7. this.iframe = iframe;
  8. iframe.onload = () => {
  9. this.frameLoaded();
  10. };
  11.  
  12. document.body.appendChild(iframe);
  13. }
  14. frameLoaded() {
  15. console.log("frame loaded");
  16. }
  17. }
  18.  
  19. class CustomFrameCreator extends FrameCreator {
  20. addContent() {
  21. console.log(this); // returns the object
  22. }
  23. frameLoaded() {
  24. console.log(this); // returns the object now
  25. }
  26. }
  27.  
  28. var frame = new CustomFrameCreator();
  29. frame.addContent();

猜你在找的JavaScript相关文章