在JavaScript中,除了变量定义外,“ this”是否必要

问题描述 投票:2回答:5

我的问题很简单。

[我只是偶然发现,一旦将this.定义为一个对象的属性,当您要调用它们时,就不再需要在this.之前添加前缀。

所以this.确实应该用于广告定义时间,例如var

我不久之后就发现了自己,当时我正在用这个引用窗口对象。因为我不使用new来调用对象,所以就像一个函数一样。

一个额外的问题,也许要发表评论。在主对象内部,如果我创建一个新对象,并在对象定义期间使用this,则此this将指的是什么?

javascript this scope javascript-objects
5个回答
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
投票

所以这。是真的要用于广告定义时间,例如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.
}

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创建的变量是公共的,因此您可以在函数外部访问它们。


1
投票

否,除非this的上下文是global对象,例如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

参考:


0
投票

我想我明白了。

我将对象定义为The this keyword,然后用this对其进行了调用。这样,My_Object被视为函数,而不是对象,因此被视为==窗口。

所以最后我将属性和方法附加到窗口而不是My_Object!这样就可以在不加function My_Object(){...}的情况下可用。

将My_Object初始化为对象的正确方法是像这样MyObject()那样调用它,对吗?

© www.soinside.com 2019 - 2024. All rights reserved.