Javascript 是';s生命周期方法自动绑定?如果不是的话,我们应该用这个来约束他们吗?
我认为这个标题是相当自我描述的 我已经使用类表示法构建了react组件,并且我注意到,Javascript 是';s生命周期方法自动绑定?如果不是的话,我们应该用这个来约束他们吗?,javascript,reactjs,ecmascript-6,es6-class,Javascript,Reactjs,Ecmascript 6,Es6 Class,我认为这个标题是相当自我描述的 我已经使用类表示法构建了react组件,并且我注意到,handleSomething必须手动绑定到this,render和组件将挂载。方法是否已绑定到此上?出于一致性考虑,手动绑定可以吗?了解JavaScript中的“this” 函数中的“this”关键字由函数的执行范围决定。例如,当使用obj.someFunction()调用时,someFunction中的this将是obj 一个更具体的例子: 函数handleClick(){ console.log(this
handleSomething
必须手动绑定到this
,render
和组件将挂载
。方法是否已绑定到此上?出于一致性考虑,手动绑定可以吗?了解JavaScript中的“this”
函数中的“this”关键字由函数的执行范围决定。例如,当使用obj.someFunction()
调用时,someFunction
中的this
将是obj
一个更具体的例子:
函数handleClick(){
console.log(this.state.value);
}
变量状态={value:1};//在窗口中声明一个变量
log(“handleClick()”);
handleClick();//记录1。方法中的“this”将是window,因为该方法是在window中调用的
var obj={
状态:{value:2},
handleClick:function(){
console.log(this.state.value);
},
};
log(“obj.handleClick();”);
对象handleClick();//记录2。“this”指的是obj,因为该方法是在obj中调用的。
//让我们将函数重新分配给窗口中的临时变量
var temp=对象把手舔;
log(“temp()”);
temp();//记录1。函数中的“this”被引用到窗口,因为该方法是在窗口中调用的。
console.log(“window.temp()”);
window.temp();//这与上面的一个相等。
控制台日志(“临时绑定(obj)”;
温度绑定(obj)(;//记录2。绑定该方法并调用该方法,因此函数中的“this”被引用到obj。
console.log(“临时绑定(this)”);
临时绑定(this)(;//记录1。因为这在执行范围中是窗口。这实际上是同一个召唤。
控制台日志(“临时绑定(窗口)”;
临时绑定(窗口)(;//记录1。这与上面的一个相等。
请在此处尝试:
关于此的博客帖子:
回到你的问题上来
如果查看类中定义的render
、组件willmount
和handleSomething
,就会明白为什么需要将处理程序绑定到此上
提供
这就是react callredner()
,其中实例是具有状态、道具等的对象实例。通过在渲染方法中放置断点并返回调用堆栈,您可以非常轻松地进行尝试
把手
例如,如果您这样定义类,则使用按钮的onClick
回调方法handleSomething
class Button extends Component {
handleSomething() {
// 'this' will be undefined.
}
render() {
return (<button onClick={this.handleSomething}>Test</button>);
}
}
其中,func
是handleSomething
,context
在我的调试经验中通常是undefined
,而funcArgs
是在函数中传递的参数
apply
类似于bind
。第一个参数用于指定函数的this
,第二个参数是要传递到函数中的参数数组
有关应用的更多信息,请参见MDN:
在这种情况下,调用方法handleSomething
时使用undefined
作为this
;因此,如果没有绑定该方法,则此
将是未定义的
我注意到,虽然handleSomething必须手动绑定到此,
渲染和组件将不会装载。方法是否受此约束
已经
它们是通过类的实例调用的,因此它们已经将this
作为您的实例,而不使用bind
。我想你可以说它已经绑定到了这个
出于一致性考虑,手动绑定可以吗
您不需要使用react的生命周期方法绑定此。如果你真的想,我想你也可以把这些方法绑定到这个(可能有一些副作用我不知道,因为我没有深入研究它们的源代码),但这就像做obj.handleClick.bind(obj)()代码>而不是obj.handleClick()代码>。这是不必要的,并且会花费一些时钟周期来做一些不需要的事情。了解JavaScript中的“this”
函数中的“this”关键字由函数的执行范围决定。例如,当使用obj.someFunction()
调用时,someFunction
中的this
将是obj
一个更具体的例子:
函数handleClick(){
console.log(this.state.value);
}
变量状态={value:1};//在窗口中声明一个变量
log(“handleClick()”);
handleClick();//记录1。方法中的“this”将是window,因为该方法是在window中调用的
var obj={
状态:{value:2},
handleClick:function(){
console.log(this.state.value);
},
};
log(“obj.handleClick();”);
对象handleClick();//记录2。“this”指的是obj,因为该方法是在obj中调用的。
//让我们将函数重新分配给窗口中的临时变量
var temp=对象把手舔;
log(“temp()”);
temp();//记录1。函数中的“this”被引用到窗口,因为该方法是在窗口中调用的。
console.log(“window.temp()”);
window.temp();//这与上面的一个相等。
控制台日志(“临时绑定(obj)”;
温度绑定(obj)(;//记录2。绑定该方法并调用该方法,因此函数中的“this”被引用到obj。
console.log(“临时绑定(this)”);
临时绑定(this)(;//记录1。因为这在执行范围中是窗口。这实际上是同一个召唤。
控制台日志(“临时绑定(窗口)”;
临时绑定(窗口)(;//记录1。这与上面的一个相等。
请在此处尝试:
关于此的博客帖子:
回到你的问题上来
如果查看渲染
,组件将挂载
,以及handl
class Button extends Component {
handleSomething() {
// 'this' will be undefined.
}
render() {
return (<button onClick={this.handleSomething}>Test</button>);
}
}
function callCallback() {
fakeNode.removeEventListener(evtType, callCallback, false);
// This is where react calls your method.
func.apply(context, funcArgs);
didError = false;
}