如何通过这个'对象回调函数,使用协议apply在函数中调用

时间:2017-02-26 14:54:20

标签: javascript callback this

主要功能如下,这将导致' setState'不是有效的财产例外。

at()

api.js的片段如下。 主函数调用Api.daysOfMonth(...),Api.daysOfMonth将使用全局对象调用ajax方法并使用协议应用调用回调函数,回调函数从main函数传入如上脚本。



componentWillMount = function () {
    api.daysOfMonth(this, this.props.month, this.props.year, function (ds) {
        var days = [];
        ds.forEach(function (jsonDay) {
            var day =  {date: jsonDay.date, inRange: jsonDay.inRange};
            days.push(day);
        });

        this.setState({ daysOfMonth: days });
  });




1 个答案:

答案 0 :(得分:1)

如果这确实回答了您的问题,原因是因为.bind()将新创建的函数的this绑定到您作为第一个参数传递的函数。

componentWillMount = function () {
    api.daysOfMonth(this, this.props.month, this.props.year, function (ds) {
        var days = [];
        ds.forEach(function (jsonDay) {
            var day =  {date: jsonDay.date, inRange: jsonDay.inRange};
            days.push(day);
        });

        this.setState({ daysOfMonth: days });
  }.bind(this));

另请参阅:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

请注意,如果你编写es6,你可以使用箭头功能做同样的事情。

componentWillMount = function () {
    api.daysOfMonth(this, this.props.month, this.props.year, (ds) => {
        var days = [];
        ds.forEach(function (jsonDay) {
            var day =  {date: jsonDay.date, inRange: jsonDay.inRange};
            days.push(day);
        });

        this.setState({ daysOfMonth: days });
  });

简而言之,箭头函数中的this是词法范围,这意味着this保证与定义箭头函数的this相同。

另请参阅:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions