【问题标题】:Javascript Objects, specifically this keyword [closed]Javascript对象,特别是这个关键字[关闭]
【发布时间】:2012-09-20 21:25:27
【问题描述】:

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

【问题讨论】:

标签: javascript object this


【解决方案1】:

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

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

foo();

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

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

someObj.foo();

然后将其this 设置为对象。

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

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

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

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

关于听众中的this,这里已经回答了:onClick Function "this" Returns Window Object

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

【讨论】:

    【解决方案2】:

    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

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

    【讨论】:

    • this 与(执行)上下文或范围或“所有者”对象无关,其值由函数的调用方式或bind 设置。
    • @RobG 实际上,它与“所有者”对象有很大关系。你只是读得太多了。我把它放在OP可以理解的术语中。 函数的调用方式所有权在这种情况下是一回事。如果一个函数是另一个对象的成员,即另一个对象拥有它,this 将引用 owner 对象,前提是该函数被正常调用从对象。由于大多数情况下大部分时间都发生在幕后(使用事件侦听器等),因此我根据“所有权”而不是如何调用它来解释它。
    • @RobG 执行上下文,顺便说一下,与“如何调用函数”直接相关。如果我们有一个函数 foo(),并且我们设置了someObject.onclick = foo;,我们现在有两种方法来调用 foo。如果我们只用foo() 调用foo,它会在窗口的范围内执行,而foo 的所有者是window。如果我们调用someObject.click() 或以其他方式调用点击处理程序,foo 在对象的范围执行。因此,实际上,如果您不从字面上理解,this 与执行上下文、范围和“所有者”对象有关。你只是在玩语义。
    • @RobG 很抱歉炸毁了 cmets,但我想补充的最后一件事是,虽然你是正确的,但你如何调用函数决定了 this 是什么,你的方式调用函数不是根本原因。你调用函数的方式决定它的执行上下文/作用域/父级,它决定了this所指的内容。
    • 唯一值得加入的术语是那些与 ECMA-262 一致的术语。函数的this 是动态的,并且完全独立于其范围设置,根据函数的声明或初始化方式,它或多或少是静态的(除了使用with)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多