Javascript'this'在对象文字中

时间:2013-04-27 11:23:18

标签: javascript

我是javascript的新手。我正在做一些“对象文字”。下面是我正在尝试的代码。 BodyLoaded是body标签的onload事件的事件处理程序。

// works - getName返回“bingo”

function BodyLoaded()
{
    var dog = {

        name: "defaultname",
        getName: function () {
            return name;
        },
        setName: function (n) {
            name = n;
        }
    };

    dog.setName("bingo");
    console.log(dog.getName());
}

//也适用 - getName返回“bingo”

function BodyLoaded()
{
    var dog = {

        name: "defaultname",
        getName: function () {
            return this.name;
        },
        setName: function (n) {
            this.name = n;
        }
    };

    dog.setName("bingo");
    console.log(dog.getName());
}

//不起作用 - getName返回“”

function BodyLoaded()
{
    var dog = {

        name: "defaultname",
        getName: function () {
            return this.name;
        },
        setName: function (n) {
            name = n;
        }
    };

    dog.setName("bingo");
    console.log(dog.getName());
}

上面的代码在调用getName(“bingo”)时返回预期的结果。但是如果我在getName函数中返回this.name,它将返回并清空字符串。奇怪的是,如果我在两个函数(setName和getName)中使用this.name,代码工作正常并返回预期值(“bingo”)。试图理解这种行为。

3 个答案:

答案 0 :(得分:2)

当您从方法返回name时,它实际上会返回window.name,因为不涉及上下文。

当您致电this.name时,this指向具有dog属性的name对象,以便返回该属性。

答案 1 :(得分:1)

如果在设置this值时未指定name,则设置的实际变量将为window.name。但是当您使用this.name时,设置的实际值将为dog.name。只需修改下面给出的代码,然后看看。

function BodyLoaded()
{

    var dog = {

    name: "defaultname",
    getName: function () {
        return this.name;
    },
    setName: function (n) {
        this.name = n;
    }
};

dog.setName("bingo");
console.log(dog.getName());

}

但是根据你给出的代码,我无法理解获取空字符串的原因。如果实际应该输出值defaultname

答案 2 :(得分:0)

function Dog() {
    var self = this;

    this.name = "defaultname";
    this.getName = function () {
        return this.name;
        // same as
        // return self.name
    }
}
var myDog = new Dog();
myDog.getName(); // defaultname