class Foo extends React.Component{
constructor( props ){
super( props );
this.handleClick = this.handleClick.bind(this);
}
handleClick(event){
// todo something
}
render(){
return (
<button type="button" onClick={this.handleClick}>
Click Me
</button>
);
}
}複製代碼
function display(){
console.log(this); // this 指向全局對象
}
display(); 複製代碼
隱式綁定(Implicit binding)javascript
var obj = {
name: 'coco',
display: function(){
console.log(this.name); // this 指向 obj
}
};
obj.display(); // coco複製代碼
當咱們經過obj調用 display( ) 時,this 上下文執行 obj, 可是當咱們將 display( ) 賦給一個變量,好比:
java
var name = "oh! global";
var outerDisplay = obj.display;
outerDisplay(); // oh! global複製代碼
function handleClick(callback) {
callback()
}
var name = 'oh! global';
handleClick(obj.display);
// oh! global複製代碼
顯式綁定(Explicit binding)bash
爲了不上面問題,咱們能夠經過 bind( ) 來顯式綁定 this 的值。
babel
var name = "oh! global";
obj.display = obj.display.bind(obj);
var outerDisplay = obj.display;
outerDisplay();
// coco複製代碼
class Foo {
constructor(name){
this.name = name
}
display(){
console.log(this.name);
}
}
var foo = new Foo('coco');
foo.display(); // coco
// 下面例子相似於在 React Component 中 handle 方法看成爲回調函數傳參
var display = foo.display;
display() // TypeError: this is undefined複製代碼
class Foo {
constructor(name){
this.name = name
this.display = this.display.bind(this);
}
display(){
console.log(this.name);
}
}
var foo = new Foo('coco');
foo.display(); // coco
var display = foo.display;
display(); // coco複製代碼
固然,咱們能夠不在 constructor 中綁定 this, 好比:
函數
var foo = new Foo('coco');
foo.display = foo.display.bind(foo);
var display = foo.display;
display(); // coco複製代碼
class Foo extends React.Component{
handleClick = () => {
console.log(this);
}
render(){
return (
<button type="button" onClick={this.handleClick}>
Click Me
</button>
);
}
}複製代碼
箭頭函數
ui
class Foo extends React.Component{
handleClick(event) {
console.log(this);
}
render(){
return (
<button type="button" onClick={(e) => this.handleClick(e)}> Click Me </button>
);
}
}複製代碼
其餘this