-1

我目前正在学习 javascript,并且正在努力理解对象,尤其是“this”关键字。我已经浏览了 W3schools 上的教程并搜索了 youtube,并且希望有人可以在 javascript 中提供一个关于“this”的好教程。

4

2 回答 2

1

忽略Function.prototype.bindES5 中引入的 , 的值this由函数的调用方式设置。

如果使用非限定标识符调用函数,例如

foo();

然后在进入函数时,thisundefined。在非严格模式下,它将被设置为全局对象(浏览器中的窗口),或者在严格模式下,它将保持为undefined.

如果函数作为对象的方法被调用,例如

someObj.foo();

然后将其this设置为对象。

如果使用new运算符调用函数,则将其this设置为创建的新对象,就像由new Object().

function Foo(name) {
    this.name = name; // this references a new Object
}

如果使用callor调用函数apply,则this可以将其设置为非严格模式下的任何对象或严格模式下的任何值(甚至为 null)。

所以this与执行上下文、范围或其他任何东西无关。它完全与如何调用函数或如何使用 设置值有关bind

关于this监听器,这里已经回答了:onClick Function "this" Returns Window Object

动态附加的侦听器是类似的,但是在旧的 IE 中也有一些怪癖需要处理,这些问题在关于附加侦听器的文章中进行了处理。

于 2012-09-20T23:28:18.697 回答
0

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.

如果有什么我遗漏的内容您仍然不太明白,请告诉我。

于 2012-09-20T21:45:46.587 回答