【问题标题】:Why we used "this" keyword in this snippet?为什么我们在这个片段中使用“this”关键字?
【发布时间】:2011-11-02 20:06:33
【问题描述】:
    var someObject = {
someArray : new Array(),

someInt : 0,

Total: function(){

this.someInt = 0;//we used "this" keyword here, why?Cant we just say "someInt = 0"?

for(var i=0;i<this.someArray.length;i++){//and here..

var c = this.someArray[i];//again we use "this"

this.someInt += c.value;//also here
}

那么我们为什么要使用“this”关键字呢?我们不能只输入变量的名称吗?

【问题讨论】:

  • 之前声明了 someInt 但是是的, someInt 可能被用作 /var (另外,指出 this.someInt 在这个特定的 sn-p 中没有效果,所以它可以被完全删除)

标签: javascript oop object this code-snippets


【解决方案1】:

this 关键字是指稍后代表其调用的对象,即,如果您像这样调用函数:

someObject.Total()

那么this 将在函数内部引用someObject。感谢this 关键字,该函数可以修改someInt 并从someArray 中读取someObject 的成员。如果您从函数体中删除了this,所有这些引用都将指向全局变量或函数体的本地变量。

【讨论】:

    【解决方案2】:

    不,someInt = 0 语句不会修改someObjectsomeInt 属性。相反,它会修改全局/默认对象(浏览器中的window)上名为someInt 的属性,这显然不是您想要的。

    请注意(取决于您打算如何调用Total 函数)您也可以将其写为someObject.someInt。但是,当这样调用函数时:

    someObject.Total()
    

    ...函数中this的值等于someObject

    【讨论】:

      【解决方案3】:

      不,因为变量没有完全创建。通过使用“this”关键字,您可以从自身访问变量。

      【讨论】:

        【解决方案4】:

        在我看来这只是为了清楚起见。当您不对实例变量和局部变量使用特殊的命名约定时,始终使用 this. 可能是一个好习惯(在其他语言中也是如此,而不仅仅是 javascript)。

        即使在这种情况下可能不需要它,但如果你有一个更大的函数,有很多局部变量和实例变量,当你区分时它会让事情变得更加清晰。

        【讨论】:

        • 回答另一个问题:不,我们不能“只输入变量的名称”,因为该变量不会被定义为someObject 的属性,而是作为本地的(如果使用var) 或全局变量。
        • 对,这不是“为了清楚起见”。
        • 是的,我说得太早了——在这种情况下,this 是必需的——我正在考虑使用 C#/Java,这样的东西更像是偏好/可读性。跨度>
        • 请随意对我的答案投反对票 - 我现在为弄错这个错误并获得支持而感到内疚。
        【解决方案5】:

        事实上,Douglas Crockford 在他的Javascript The Good Parts 中建议不要在代码中使用 this 关键字,因为对象中的函数可能会应用于其他对象,这可能会导致错误。所以有时最好只使用变量名。

        【讨论】:

        • 只使用变量名并不好。 Douglas Crockford 说将“this”分配给“that”,并使用“that”而不是“this”。这样,当从另一个对象的上下文调用方法时,“that”将引用原始上下文而不是调用上下文。我希望这是有道理的
        【解决方案6】:

        someInt 被定义为someObject 的属性。需要将其定义为变量才能以这种方式访问​​它。

        http://jsfiddle.net/Z7mSK/

        【讨论】:

          【解决方案7】:

          详细了解this关键字HERE

          【讨论】:

            猜你喜欢
            • 2014-07-01
            • 2012-07-24
            • 1970-01-01
            • 1970-01-01
            • 2022-11-18
            • 2017-07-21
            • 2018-02-11
            • 2011-03-20
            相关资源
            最近更新 更多