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

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.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116074.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cifar10 数据集介绍「建议收藏」

    cifar10 数据集介绍「建议收藏」基本信息CIFAR-10是一个包含60000张图片的数据集。其中每张照片为32*32的彩色照片,每个像素点包括RGB三个数值,数值范围0~255。所有照片分属10个不同的类别,分别是’airplane’,’automobile’,’bird’,’cat’,’deer’,’dog’,’frog’,’horse’,’ship’,’truck’。其中五万张图片被划分为训练…

    2022年6月22日
    41
  • SecureCRTPortable.exe 如何上传文件「建议收藏」

    SecureCRTPortable.exe 如何上传文件「建议收藏」如果未安装在命令行输入:yuminstalllrzszrz然后上传自己的文件。在解压转载于:https://www.cnblogs.com/hgj123/p/4561754.html

    2022年6月9日
    34
  • WPF之ListView使用WrapPanel

    WPF之ListView使用WrapPanel为了在ListView中显示Wrap样式的子项,需要设置ItemsPanel为WrapPanel,如下所示。此外,还要将ScrollViewer.HorizontalScrollBarVisibility设置为"Disabled",否则是不能Wrap的。实现的代码如下所示:           &lt;ListView ItemsSource="{BindingSource…

    2022年7月23日
    12
  • 如何在WEBIDE个人版中添加其它版本的资源库「建议收藏」

    如何在WEBIDE个人版中添加其它版本的资源库「建议收藏」SAP资源库不断的在更新,怎么在本地的WEBIDE中使用新版本中的控件呢?答案就是添加相应版本的SDK到本地的resource库1.下载所需要版本的源这里下载所需要的SDK2.添加源到WEBIDE只需要解压resource和test-resource这两个文件夹到本地WEBIDE路径下,参照本地orion所在的目录路径在这个路径下对应下载的SDK的版本新建一个文件夹,我下的…

    2022年10月10日
    4
  • 华为交换机关闭网口_华为交换机如何关闭端口号

    华为交换机关闭网口_华为交换机如何关闭端口号华为交换机怎样把端口从vlan中删除??答:通过displayvlan查看当前vlan列表通过displayvlanvlan-id比如displayvlan100,查看vlan100的状态,里面列出vlan100里有哪些端口,有哪些端口为untagged或者tagged也可以通过displaycur查看配置来得出还有查看端口状态displayinterface。通过display…

    2022年7月20日
    161
  • 5G 信道一览表

    5G 信道一览表各个地区2.4G及5G信道一览表美洲(FCC)2.412~2.462GHz:11个信道5.15~5.35GHz,5.725~5.825GHz;12个信道中国2.412~2.472GHz:13个信道5.725~5.825GHz:4个信道ETSI2.412~2.472GHz:13个信道5.15~5.35GHz:8个信道5470…

    2022年6月7日
    267

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号