欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

彻底弄懂js中的this指向

程序员文章站 2022-03-29 08:34:12
...

首先我讲两点重要的规则,基本一切都是基于这个

1.this在函数中的指向永远由最后调用这个函数的东西决定,谁调用就指向谁

2.如果出现这一条,则第一条无效,即函数后出现.bind(A),那么无论谁最后调用这个函数,这个函数中的this都将指向A,因为这个函数在声明的时候,this就已经注定绑定成指向A了,不会再改了

 

接下来讲几种情况

就单单只讲一个react的吧,其他的以后再说吧,对象,事件函数等等

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>state</title>
</head>
<body>
	<!-- 准备好一个“容器” -->
	<div id="test"></div>
	
	<!-- 引入react核心库 -->
	<script type="text/javascript" src="../js/react.development.js"></script>
	<!-- 引入react-dom,用于支持react操作DOM -->
	<script type="text/javascript" src="../js/react-dom.development.js"></script>
	<!-- 引入babel,用于将jsx转为js -->
	<script type="text/javascript" src="../js/babel.min.js"></script>

	<script type="text/babel">
		//1.创建组件
		class Weather extends React.Component{
			
			//构造器调用几次? ———— 1次
			constructor(props){
				console.log('constructor');
				super(props)
				//初始化状态
				this.state = {isHot:false,wind:'微风'}
				//解决changeWeather中this指向问题,因为constructor中this指向实施
                //那么现在就绑定,函数里的this就一直是实例,谁调用都不会再变,符合规则2
				this.changeWeather = this.changeWeather.bind(this)
			}

			render(){
				console.log('render');
				//读取状态
				const {isHot,wind} = this.state
				return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
			}
			changeWeather(){
				//changeWeather放在哪里? ———— Weather的原型对象上,供实例使用
				//由于changeWeather是作为onClick的回调,所以不是通过实例调用的,是直接调用,至于谁调用,谁调用就指向谁,而这里打印undefined,又是严格模式,说明本来是window调用的,因为只有本来指向window,在严格模式下才会变成指向undefined
				//类中的方法默认开启了局部的严格模式,所以changeWeather中的this为undefined
				console.log('changeWeather');
				console.log(this);
			}
		}
		ReactDOM.render(<Weather/>,document.getElementById('test'))
				
	</script>
</body>
</html>