反应:当没有约束时,'这个'在React组件事件处理程序中为null而不是undefined

时间:2017-05-25 07:07:56

标签: javascript reactjs ecmascript-6

我正在查看有关处理https://facebook.github.io/react/docs/handling-events.html

事件的反应文件

这部分提到了以下行:"在JavaScript中,默认情况下不绑定类方法。如果您忘记绑定this.handleClick并将其传递给onClick,则在实际调用该函数时,这将是未定义的。"

Codepen上提供了一个示例。我尝试通过注释删除绑定 " this.handleClick = this.handleClick.bind(this);" 并添加" console.log(this)"在handleClick方法上。 这是编辑过的分叉版本: http://codepen.io/anakornk/pen/wdOqPO

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback
   // this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    console.log(this);
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);

根据doc中的上述说法,输出应该是&#34; undefined&#34; ,但是&#34; null&#34;而是显示出来了。

这是为什么?

1 个答案:

答案 0 :(得分:1)

您可以在此行上设置断点并检查调用堆栈。

ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) {
  var boundFunc = func.bind(null, a, b); // <-- this is why context is null
  var evtType = 'react-' + name;
  fakeNode.addEventListener(evtType, boundFunc, false);
  var evt = document.createEvent('Event');
  evt.initEvent(evtType, false, false);
  fakeNode.dispatchEvent(evt);
  fakeNode.removeEventListener(evtType, boundFunc, false);
};

&#13;
&#13;
"use strict"

function fn() {
  return this;
}

console.log(fn(), fn.bind(null)())
&#13;
&#13;
&#13;