请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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回答

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

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

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

  3. bind/call/apply

  4. 使用new

优先级从上到下依次增加

0 回复 有任何疑惑可以回复我~
  • 提问者 夜魇丶 #1
    …嗯 这四种情况我明白。但是我没明白this.handleBtnClick可以实现效果,而这里的this指向的是btn,为什么改成btn.handleBtnClick就没用了。(难道this指向的不是btn么?)
    回复 有任何疑惑可以回复我~ 2020-03-20 15:37:31
  • 呀呀呀亚歌 回复 提问者 夜魇丶 #2
    那个函数不是btn上面的函数,是你自己定义的,是在this上
    回复 有任何疑惑可以回复我~ 2020-03-20 21:20:27
  • 提问者 夜魇丶 回复 呀呀呀亚歌 #3
    懂了。我以为this.handleBtnClick指向的是btn。把btn改成Page.prototype就可以了
    回复 有任何疑惑可以回复我~ 2020-03-20 22:05:13
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信