我目前正在学习 javascript,并且正在努力理解对象,尤其是“this”关键字。我已经浏览了 W3schools 上的教程并搜索了 youtube,并且希望有人可以在 javascript 中提供一个关于“this”的好教程。
2 回答
忽略Function.prototype.bind
ES5 中引入的 , 的值this
由函数的调用方式设置。
如果使用非限定标识符调用函数,例如
foo();
然后在进入函数时,this
是undefined
。在非严格模式下,它将被设置为全局对象(浏览器中的窗口),或者在严格模式下,它将保持为undefined
.
如果函数作为对象的方法被调用,例如
someObj.foo();
然后将其this
设置为对象。
如果使用new
运算符调用函数,则将其this
设置为创建的新对象,就像由new Object()
.
function Foo(name) {
this.name = name; // this references a new Object
}
如果使用call
or调用函数apply
,则this
可以将其设置为非严格模式下的任何对象或严格模式下的任何值(甚至为 null)。
所以this
与执行上下文、范围或其他任何东西无关。它完全与如何调用函数或如何使用 设置值有关bind
。
关于this
监听器,这里已经回答了:onClick Function "this" Returns Window Object
动态附加的侦听器是类似的,但是在旧的 IE 中也有一些怪癖需要处理,这些问题在关于附加侦听器的文章中进行了处理。
this
是一个棘手的话题。this
指您当前正在其中工作的函数的“所有者”。根据它所处的上下文或范围,this
可能意味着几个不同的事情。通常,它指的是window
对象,它负责跟踪您的大部分 javascript 变量,并包含几个函数。这样做的原因是除非它们明确定义,否则每个 javascript 函数(和变量)的所有者都是window
. 换句话说,以下情况是正确的:
<script type="text/javascript">
var something = "Hey";
this.something === something; //these will evaluate to true, because when you
window.something === something; //declared the variable `something`, it was assigned
this === window; //to the window object behind the scenes.
</script>
不过,它并不总是指window
。在事件处理程序内部,this
通常指的element
是触发事件的事件。我不想深入探讨事件处理程序,但这里有一个使用jQuery
. 旁注——了解 jQuery 的来龙去脉。
html:
<div id="myDiv"></div>
Javascript:
<script type="text/javascript">
$('#myDiv').bind("click",function() {
$(this).css("visibility","hidden");
});
</script>
在本例中,this
指的是顶部框中的 html 元素。围绕它,因为这$()
是为元素创建 jQuery 对象的语法。我这样做是为了能够使用该css
功能,但我可以很容易地完成类似的事情this.style.visibility = "hidden";
上面示例中提到元素的原因this
是因为在幕后,jQuery 的bind
方法正在做这样的事情:
var ele = document.getElementById("myDiv");
ele.onclick = function(){ //the same function as above, but with all the
//behind-the scenes stuff that jquery does to create a jQuery
//object
};
请注意,因为我们将函数分配给ele.onclick
,所以函数“属于”元素 ,ele
。因此,在该函数内部,this
应该引用ele
.
如果有什么我遗漏的内容您仍然不太明白,请告诉我。