不用$.proxy改变this指向的问题

来源:2-4 MVVM模式

夜魇丶

2020-03-19

btn.on('click', $.proxy(this.handleBtnClick, this))

这行代码的含义我理解。
但是我不明白为什么不改变this指向,代码也能正常执行。

btn.on('click',this.handleBtnClick);

这行代码可以正常执行。这里的this指向的是btn这个DOM元素么,如果是的话。

btn.on('click',btn.handleBtnClick);

为什么这行代码没有反应,为什么不能这么改?

完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="jquery.min.js"></script>
</head>
<body>
	<div>
		<input id="input" type="text"/>
		<button id="btn" >提交</button>
		<ul id="list">
		</ul>
	</div>

	<script>

		function Page() {

		}
		$.extend(Page.prototype, {
			init: function() {
				this.bindEvents() 
			},
			bindEvents: function() {
				var btn = $('#btn');
				btn.on('click', $.proxy(this.handleBtnClick, this))
				// btn.on('click',this.handleBtnClick);
				// btn.on('click',btn.handleBtnClick);
			},
			handleBtnClick: function() {
				var inputElem = $('#input');
				var inputValue = inputElem.val();
				var ulElem = $('#list');
				ulElem.append('<li>' + inputValue + '</li>');
				inputElem.val('');
			}
		})

		var page = new Page();
		page.init();

	</script>
</body>
</html>
写回答

1回答

呀呀呀亚歌

2020-03-20

其实这个JS中有关this的问题,一般是有四种情况

  1. 默认情况,绑定在全局

  2. 隐士绑定,例如:btn.getInfo();

  3. bind/call/apply

  4. 使用new

优先级从上到下依次增加

0
3
夜魇丶
回复
呀呀呀亚歌
懂了。我以为this.handleBtnClick指向的是btn。把btn改成Page.prototype就可以了
2020-03-20
共3条回复

Vue2.5-2.6-3.0开发去哪儿网App 零基础入门到实战

课程紧跟Vue3版本迭代,企业主流版本Vue2+Vue3全掌握

10675 学习 · 8191 问题

查看课程