Почему `this` не указывает на глобальную область действия js в примере кода - PullRequest
0 голосов
/ 28 декабря 2011

Почему 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 ]

2 голосов
/ 28 декабря 2011

Зависит от ссылки на функцию (см. 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 голосов
/ 28 декабря 2011

возвращает неопределенное значение, поскольку значение является ключом внутри объекта и не отображается внутри объекта окна. вы получите доступ, используя

window.valueHolder.value

(чтобы быть понятным, в вашем коде this ключевое слово относится к объекту valueHolder)

0 голосов
/ 28 декабря 2011

Почему вы думаете, что это будет глобальный охват?

Когда у объекта есть свойство, которое ссылается на функцию, и вы вызываете эту функцию с помощью точечной нотации, например:

valueHolder.getValue();

Тогда внутри функции JavaScript автоматически устанавливает this в качестве объекта.

...