2016-05-26 82 views
1

因此,我正在进入模块化JavaScript,并且在尝试将jQuery http请求合并到我的模块时遇到了障碍。我真的不知道该怎么称呼,所以如果标题有误导性,我很抱歉。从jQuery.get()内部调用对象方法

var object = { 
    init: function() { 
     this.loadRequest(); 
    }, 
    loadRequest: function() { 
     $.get('https://myurl.com', function(data) { 
      this.parseRequest.bind(this) 
     }); 
    }, 
    parseRequest: function(data) { 
     console.log(data); 
    } 
}; 

object.init(); 

当我尝试这一点,Chrome的告诉我:

Uncaught TypeError: Cannot read property 'bind' of undefined 

所以我猜它是与我是如何结合的方法,我的对象,但我似乎无法图了解如何使其工作。

+0

来不及。 ; '这个'已经是错误的了。你需要了解绑定实际上做了什么。 – SLaks

+1

'$ .get('https://myurl.com',this.parseRequest.bind(this));' – nnnnnn

回答

1

您对在不同情况下实际上涉及的内容有些误解。我强烈建议您阅读https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this以更好地了解this提及的内容,因为它是一个重要的概念。

下面是对您的代码的修复。如果你想使用bind()

var object = { 
    init: function() { 
     this.loadRequest(); 
    }, 
    loadRequest: function() { 
     $.get('https://myurl.com', this.parseRequest.bind(this)); 
    }, 
    parseRequest: function(data) { 
     console.log(data); 
    } 
}; 

object.init(); 

的jsfiddle:https://jsfiddle.net/rtbbc74m/

常用的另一种方法是var self = this(延伸阅读:How to use the self with object-oriented javascript and closures):

var object = { 
    init: function() { 
     this.loadRequest(); 
    }, 
    loadRequest: function() { 
     var self = this; 
     $.get('https://myurl.com', function(data) { 
      self.parseRequest(data); 
     }); 
    }, 
    parseRequest: function(data) { 
     console.log(data); 
    } 
}; 

object.init(); 

的jsfiddle:https://jsfiddle.net/tz680b1c/

+1

'$ .get('https://myurl.com',this.parseRequest.bind(this ));'给你相同的结果,没有包装函数的大惊小怪。但是关于包装器,你并不需要定义'callback'变量:你可以在传递给'$ .get()'的地方直接调用匿名函数中的'.bind()'。 'this.parseRequest.bind(data);'应该是'this.parseRequest(data)'。 – nnnnnn

+0

@nnnnnn感谢您指出我'this.parseRequest.bind(data);'中的错误。我从JSFiddle中复制了一个错误的版本。此外,'$ .get('https://myurl.com',this.parseRequest.bind(this));'比声明回调要好。我已经更新了我的答案。 – user6383968