除了变量定义之外,javascript中的“this”是必需的

时间:2012-09-02 00:08:48

标签: javascript this scope javascript-objects

我的问题很简单。

我只是随便发现,一旦你将一个带有this.的属性定义到一个对象中,当你想要调用它们时,你不需要再添加this.

所以this.真的要用于广告定义时间,例如var吗?

谢谢!

更新: 不久后我发现它是我的自我,我用这个引用了窗口对象。因为我在不使用new的情况下调用了我的对象,所以就像它是一个函数一样。

感谢大家!

更新2:

另外一个问题,也许是评论。在主对象内部,如果我创建一个新对象,并在对象定义期间使用this,那么this将引用什么?

5 个答案:

答案 0 :(得分:2)

在各种情况下,您必须使用this才能引用正确的数据。

这两个实现做了很多不同的事情:

Array.prototype.truncate(newLen) {
    // sets the length property on the current Array object
    this.length = newLen;
}

Array.prototype.truncate(newLen) {
    // sets a global variable named length
    length = newLen;
}

var arr = [1,2,3,4,5,6,7];
arr.truncate(2);

您必须使用this来控制如果要修改当前对象会发生什么。您可以将其关闭并且仍然会修改当前对象属性的假设是不正确的。如果你把它关掉,你就是修改全局变量,而不是成员属性。

答案 1 :(得分:1)

  

所以这个。真的意味着要用广告定义时间,比如var?

不,this的要点是当前的执行范围。如果不使用this,您可以(并且将会)遇到奇怪的错误。例如,假设您是一个具有属性val的对象,然后在该对象的原型上

App.obj = function(){
   this.val = 'initial';
}

obj.prototype.myMethod = function(val) {
   // how would you assign argument val to object val?
}

还要注意你的推理因方法而失效。

obj.prototype.meth2 = function(){
   myMethod();  // fails where this.myMethod() would work.
}

答案 2 :(得分:1)

请参阅http://jsfiddle.net/BRsqH/

function f(){
    this.public='hello!';
    var hidden='TOP SECRET!';
}
var instance=new f();
alert('Public data: '+instance.public+ /* gives "hello!" */
    '\nHidden data: '+instance.hidden /* gives undefined */
);

使用var创建的变量是隐藏的,在创建它们的函数之外无法查看或修改。

但使用this创建的变量是公共的,因此您可以在函数外部访问它们。

答案 3 :(得分:1)

不,除非this的上下文是全局对象,例如window。请看以下示例:

function Foo(bar) {
    this.data = bar;
    console.log(this.data); // OK
    console.log(data); // ReferenceError
}

在此示例中,您将在第一个ReferenceError: data is not defined上获得console.log(data)除非data是全局变量。要访问该实例的公共成员,您使用this.data

参考文献:

答案 4 :(得分:0)

我想我明白了。

我将对象定义为function My_Object(){...},然后使用MyObject()调用它。这样,My_Object被视为一个函数,而不是一个对象,因此这个==窗口。

所以最后我将属性和方法附加到窗口而不是My_Object!这种方式可以在没有预先.this的情况下使用。

将My_Object初始化为对象的正确方法是将其称为new My_Object,不对吗?