0

可能重复:
JavaScript“this”关键字

我编写了一个名为 add 的函数,其参数为 firstName、lastName 和 email、telephone。在这个新函数中,目的是创建一个新的联系人对象,如 bob 和 mary。

我的问题是关于this关键字的上下文和使用。this允许我将新创建的对象的属性值设置为传入的适当的添加函数参数。如果this允许我在代码中执行此操作的目的是什么?这个词是什么?是否启用允许通过函数参数传递任何字符串以便可以创建多个对象的功能?

this最近使用该关键字使我能够在多个对象上使用相同的函数,而不必为每个对象编写单独的函数。例如,可以为所有对象设置年龄属性的函数,而不是每个对象单独的年龄更改函数。

其次,我想检查一下我对将数据插入到联系人数组中适当位置的方式的理解是否正确。最后,请问这里this关键字的上下文是什么?

contacts[contacts.length] = this; 

这与以下内容相同:

contacts[2] = this;

如果我没有以最简洁的方式表达我的问题,我深表歉意。请在下面找到我的代码。对于这种编码情况的关键字的任何答案或解释this将不胜感激。

var bob = {
    firstName: "Bob",
    lastName: "Jones",
    phoneNumber: "(650) 777 - 7777",
    email: "bob.jones@example.com"
};

var mary = {
    firstName: "Mary",
    lastName: "Johnson",  
    phoneNumber: "(650) 888 - 8888",
    email: "mary.johnson@example.com"
};

var contacts = [bob, mary];

    function add(firstName, lastName, email, telephone){
    this.firstName = firstName; 
    this.lastName = lastName;
    this.email = email;
    this.telephone = telephone;
    contacts[contacts.length] = this
    }

    var response1 = prompt("First Name?");
    var response2 = prompt("Last Name?");
    var response3 = prompt("Email?");
    var response4 = prompt("Telephone No.?");
    add(response1, response2, response3, response4);
4

3 回答 3

0

this在您的 add 函数中实际上是指全局窗口对象,因此您将其添加到数组而不是新联系人。

您需要在该函数中创建一个新对象并将其添加到数组中:

function add(firstName, lastName, email, telephone){
    var newContact = {
        firstName: firstName,
        lastName: lastName,
        email: email,
        telephone: telephone
    }
    contacts[contacts.length] = newContact;
}

这是一个很好的参考this- http://bonsaiden.github.com/JavaScript-Garden/#function.this

如果你真的想使用,你可以通过使用or调用函数来this指定所指的内容:thiscallapply

add.call({}, response1, response2, response3, response4); // pass new object as this
add.apply({}, [response1, response2, response3, response4]); // pass new object as this
于 2012-08-24T10:05:56.183 回答
0

this关键字有时具有实际用途:

  • 对于SOMETHING.add(response1, response2, response3, response4)this将是SOMETHING

  • 对于SOMETHING = new add(response1, response2, response3, response4),this将是新创建的对象SOMETHING

但是,当您将 add() 作为函数而不是方法调用时,this是全局(窗口)对象。因此,您只是创建了四个全局变量(firstName、lastName、email 和 phone),以后每次向数组添加条目时都会覆盖这些变量。请注意,如果您的代码是在最近的 JavaScript 解释器的可选“ES5 严格模式”下执行的,那么 add() 函数的第一行将导致运行时错误

(如果您想阅读更多内容,请参阅“this”关键字如何工作?。)

在你的情况下,我会避免this而是显式地创建一个新对象。

function add(firstName, lastName, email, telephone){
    var obj = {
        firstName: firstName,
        lastName: lastName,
        email: email,
        telephone: telephone
    };
    contacts[contacts.length] = obj;
}

关于contacts[contacts.length] = obj;,另一种方法是使用contacts.push(obj);. 但是,您拥有它的方式非常好,事实上,性能可能会稍好一些。只需选择您喜欢的。

于 2012-08-24T10:12:50.513 回答
0

this都是关于范围和上下文的。它指的是使用它的更广泛的上下文。

这是一个例子:

function MyObject(one,two) {
this.one = one;
this.two = two;
}

Myobject.prototype.SayNumbers() {
alert(this.one + this.two);
}

var myobj = new MyObject("Foo","Bar");
myobj.Saynumbers();

在上面示例的上下文中,this“属于”它在其中使用的函数——“myobj”对象。这允许它访问对象的属性并警告它们。

如果您this在全局范围内使用关键字(即不在函数/对象内),它将引用窗口对象。

this也可以通过引用传递——这对事件处理程序很有用。对于 onclick 事件,您可以传递this给事件处理函数并使用单击的对象执行操作。

尝试试验并做一些研究 - 这个网站有一些很好的例子:http ://www.quirksmode.org/js/this.html

于 2012-08-24T10:07:44.937 回答