为什么`this`并未指向代码示例中的js全局作用域

时间:2011-12-28 13:51:46

标签: javascript this

为什么this未指向下面代码中的js全局范围?

<html>
<head></head>
<body>
<script type="text/javascript">

var valueHolder = {
    value: '',
    setValue: function(newValue) {
        this.value = newValue;
    },
    getValue: function() {
        return this.value;
    }
}

valueHolder.setValue("hello world");

alert(valueHolder.getValue()); // return "hello world"
alert(valueHolder.value);      // return "hello world"
alert(window.value);           // return "undefined"

</script>
</body>
</html>

3 个答案:

答案 0 :(得分:2)

它返回undefined,因为value是对象内部的键,在window对象中不可见。你将使用

访问
window.valueHolder.value

(很明显,在您的代码中this关键字指的是valueHolder对象)

答案 1 :(得分:2)

取决于对函数的引用(the spec的c.f. 11.2.3):

var valueHolder = {
    value: '',
    setValue: function(newValue) {
        this.value = newValue;
    },
    getValue: function() {
        return this.value;
    }
}

var set = valueHolder.setValue,
    get = valueHolder.getValue;

set('test');

alert(get());                  // return "test"
alert(valueHolder.value);      // return ""
alert(window.value);           // return "test"

在上下文中引用时, this设置为相关上下文(示例中为valueHolder)。在上面的示例中,函数定义明显相同,但函数引用不在任何对象的上下文中,在这种情况下,this设置为全局上下文(window)。

答案 2 :(得分:0)

为什么你认为这将是全球范围?

当一个对象具有一个引用一个函数的属性,并使用点符号调用该函数时,如下所示:

valueHolder.getValue();

然后在函数JavaScript中自动将this设置为对象。