Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Куда пропадает глобальная переменная? (https://javascript.ru/forum/misc/61296-kuda-propadaet-globalnaya-peremennaya.html)

Gerd199 12.02.2016 01:06

Куда пропадает глобальная переменная?
 
console.log(this.id);  //Тут ок
this.mass.forEach(function(item, i, arr) {   
    console.log(this.id);  //Тут ее уже нет, undefened


Что делать и как ее сохранить?

Gerd199 12.02.2016 02:01

more_apps - относительно другой переменой, почему и что делать?

Decode 12.02.2016 03:12

А для forEach указать this не пробовал? Точнее для callback.

Gerd199 12.02.2016 03:56

Цитата:

Сообщение от Decode (Сообщение 407382)
А для forEach указать this не пробовал? Точнее для callback.

Как?

Dilettante_Pro 12.02.2016 18:00

Цитата:

Сообщение от Gerd199 (Сообщение 407377)
console.log(this.id);  //Тут ок
this.mass.forEach(function(item, i, arr) {   
    console.log(this.id);  //Тут ее уже нет, undefened


Что делать и как ее сохранить?

http://habrahabr.ru/post/149581/

Erolast 12.02.2016 18:13

this - это не глобал, this - это контекст, и в каждой функции он свой.
var globalVariable = "value"; // Вне функций переменные объявляются в глобальной области видимости.
window.globalVariable = "value"; // То же самое, потому что свойства объекта window автоматически попадают в глобальную область видимости
this.globalVariable = "value"; // То же самое, потому что вне функций контекст кода - объект window

mass.forEach(function(item, i, arr) {
  console.log(globalVariable); // Вывести значение глобальной переменной globalVariable. Никакие идентификаторы не нужны, обращение идет просто по имени переменной.
});


Разумеется, код справедлив только при исполнении в браузере, в том же node.js механизм работы с глобалом немного другой (объект global вместо window, this и внешний скоп никогда не равны global).

nodequest 12.02.2016 23:27

Не слушайте предыдущего оратора, от тут в качестве потешного, который тужится всем показать, что он что-то понимает:) Ключевое слово this выполняет роль динамической ссылки на контекст вызова. Само сабой, он не в "каждой ф-ции свой", а для каждого вызова свой, он резольвиться в рантайме, подробней можете почитать о динамическом связывании (это оно), например, в Смоллток.

nodequest 12.02.2016 23:34

Цитата:

Сообщение от Gerd199
Что делать и как ее сохранить?

Для Вашего случая, проще всего явно указывать window/global вместо this. Вообще, ваша конструкция семантически правильна, с точки зрения языка она должна работать, тут просто кривизна/закидоны конкретных реализаций дают о себе знать.

Erolast 13.02.2016 08:24

Цитата:

Не слушайте предыдущего оратора, от тут в качестве потешного, который тужится всем показать, что он что-то понимает
Лол, ну да, тебе с семнадцатью постами и двумя неделями после регистрации, несомненно, прекрасно известно, кто тут дурачок.

Цитата:

Само сабой, он не в "каждой ф-ции свой", а для каждого вызова свой
Да, так точнее. Контекст функции определяется в момент вызова и зависит от синтаксиса вызова.

При вызове глобальной функции this == window.
"use strict";

function showContext() {
    console.log(this);
}

showContext(); // Window


При вызове замкнутой функции this == undefined (в строгом режиме, разумеется).
"use strict";

(function(callback) {
    function showContext() {
        console.log(this);
    }
    
    showContext(); //undefined
})();


При вызове функции как метода какого-то объекта this равен этому объекта.
"use strict";

(function(callback) {
    function showContext() {
        console.log(this);
    }
    
    var object = {
        method: showContext
    };

    object.method(); //Object { method: showContext() }
})();


Также можно явно указать контекст функции с помощью Function#call, что и происходит в Array#forEach - здесь this резолвится в перебираемый массив.

hhh 13.02.2016 12:56

При вызове глобальной функции this == window.
у меня показывает undefined


Часовой пояс GMT +3, время: 00:29.