当前位置: 首页 > news >正文

jQuery 之 $(this) 出了什么问题?

近期在写jQuery的时候出了这样一个问题?

<html>
<head>
	<title></title>
</head>
<style type="text/css">
	.clicked{
		width: 100px;
		height: 40px;
		border-radius: 3px;
		background-color: #cba;
	}
</style>
<body>
	<a href="#" id="test" >yes</a>
<script type="text/javascript" 
	src="jquery-1.10.2.min.js">
</script>
<script type="text/javascript">

	$(function() {
		$('a').click(function(event) {
			$(this).addClass('clicked');
			setTimeout(function(){
				$(this).removeClass('clicked');
			},3000);
		});
	});
</script>
</body>
</html>


发现过了"一天" 这个button的效果也没有被移除,这让我十分的诧异.jQuery出了问题?

我毫不犹豫的问了自己这样一个问题,紧接着,我就否决了.为啥呢?由于我认为我想多了.....

可是这件事要搞明确.

可是问题在以下,为什么以下的那个setTimeout()无法工作呢.

我百思不得其解.

于是乎,我在setTimeout的匿名函数中打印了这种东西.

cosole.log(this === window);

返回值 true //? what.

怎么会这样,我是写着玩的...

于是我又细致探究了一下.

原来

在传统的onevent属性代码中,this 引用接收事件元素 ---可是仅仅在属性中,而不在从属调用的函数中.

这句话是什么意思呢?

就是它确实是在我们的那个click中.可是假设在里面调用闭包的函数时,this对象就又又一次指回了我们的window对象.

那要如何解决问题呢...非常好办啊..

<span style="font-size:18px;"><script type="text/javascript">

	$(function() {
		$('a').click(function(event) {
			$this = $(this);
			$this.addClass('clicked');
			setTimeout(function(){
				console.log(this === window);
				$this.removeClass('clicked');//2
			},3000);
		});
	});
</script></span>

对了.就是将$(this) 保存成一个本地的变量..那么为什么将this 或者$(this)拷贝到一个本地变量能解决问题?

javascript为參数核函数的局部变量创建了一个闭包.

闭包能够归纳为一下的4个内容.

1能够在javascript函数中嵌套还有一个函数,嵌套能够为多级.

2函数不仅能读取自己的 參数和局部变量,并且能读写嵌套函数中的变量.

3即使外部函数已经返回之后再调用内部函数相同有效.比方setTimeout

4无论匿名或者命名函数都一样.this是javascript特殊的keyword,所以这些原则都不适用,通过将this的值拷贝到一个局部变量中,就能利用闭包使该值在不论什么嵌套函数中使用.


Best Wishes.


相关文章:

  • 【< AQS>】
  • 软件抄袭与创新的思考
  • 【< J.U.C>】
  • Github实例教程-创建库、创建主页
  • 【<Java中的线程池>】
  • 关于数组添加值和访问值的一些小问题
  • hdu 5623 KK's Number(dp)
  • 【阅读源码系列】HashMap源码分析(JDK1.7和JDK1.8)
  • 使用开源的PullToRefreshScrollView scrollTo和scrollby遇到的问题
  • 【阅读源码系列】ThreadPoolExecutor源码
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • YII 路由配置
  • 讲一下ISO七层模型?
  • Python 17.1 HTTP协议简介
  • 培训机构出来的iOS学员怎么了?
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CentOS 7 修改主机名
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Markdown 语法简单说明
  • PermissionScope Swift4 兼容问题
  • python_bomb----数据类型总结
  • Travix是如何部署应用程序到Kubernetes上的
  • 半理解系列--Promise的进化史
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 判断客户端类型,Android,iOS,PC
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 小李飞刀:SQL题目刷起来!
  • ​人工智能书单(数学基础篇)
  • #100天计划# 2013年9月29日
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (rabbitmq的高级特性)消息可靠性
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)Google的Objective-C编码规范
  • (转)可以带来幸福的一本书
  • **python多态
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • /etc/sudoer文件配置简析
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Mapper作用
  • @Not - Empty-Null-Blank
  • @Query中countQuery的介绍
  • @RestControllerAdvice异常统一处理类失效原因
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ solr入门 ] - 利用solrJ进行检索
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [100天算法】-x 的平方根(day 61)
  • [2016.7 test.5] T1
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [ANT] 项目中应用ANT
  • [BJDCTF2020]The mystery of ip1