参见英文答案 >
How to access the correct `this` inside a callback?8个
我认为这是一个范围问题,但我不知道如何解决这个问题.
这是我的代码: http://jsfiddle.net/9k9Pe/1498/
我认为这是一个范围问题,但我不知道如何解决这个问题.
这是我的代码: http://jsfiddle.net/9k9Pe/1498/
- class FrameCreator{
- constructor(){
- this.createFrame();
- }
- createFrame(){
- var iframe = document.createElement('iframe');
- this.iframe = iframe;
- var frameLoaded=this.frameLoaded;
- iframe.onload = function () {
- frameLoaded();
- };
- document.body.appendChild(iframe);
- }
- frameLoaded(){
- console.log("frame loaded");
- }
- }
- class CustomFrameCreator extends FrameCreator{
- addContent(){
- console.log(this); // returns the object
- }
- frameLoaded(){
- console.log(this); // returns undefined
- }
- }
- var frame=new CustomFrameCreator();
- frame.addContent();
frameLoaded()打印undefined,而addContent打印对象.
如何解决这个问题,所以我可以在加载框架时有一个参考?
谢谢
解决方法
.bind()的另一个替代方法是使用ES6 Arrow函数来保留上下文:
- iframe.onload = () => {
- this.frameLoaded();
- };
- class FrameCreator {
- constructor() {
- this.createFrame();
- }
- createFrame() {
- var iframe = document.createElement('iframe');
- this.iframe = iframe;
- iframe.onload = () => {
- this.frameLoaded();
- };
- document.body.appendChild(iframe);
- }
- frameLoaded() {
- console.log("frame loaded");
- }
- }
- class CustomFrameCreator extends FrameCreator {
- addContent() {
- console.log(this); // returns the object
- }
- frameLoaded() {
- console.log(this); // returns the object now
- }
- }
- var frame = new CustomFrameCreator();
- frame.addContent();