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

Erolast 13.02.2016 13:40

Цитата:

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

А, это из-за того, что код из тега в песочнице выполняется.
Если скопировать в консоль, то будет window, как и положено.

hhh 13.02.2016 14:32

Я проверял через sublime у себя на локалке. Без 'use strict' показывает window

Erolast 13.02.2016 15:44

Цитата:

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

Цитата:

Сообщение от hhh (Сообщение 407619)
Я проверял через sublime у себя на локалке. Без 'use strict' показывает window

Так window или undefined? Ты вообще про какой пример?

hhh 13.02.2016 17:39

Первый пример с 'use strict' undefined, без 'use strict' window.

https://jsfiddle.net/3vk3ak7t/
https://jsfiddle.net/3vk3ak7t/1/

Erolast 13.02.2016 17:56

Ну ёлы, это ж не штатное исполнение браузером. jsfiddle, тег JS и, очевидно, sublime (никогда не пользовался сублаймом) исполняют код в замыкании, а не глобале, так что получается второй пример, а не первый. В ноде тоже undefined будет, ага, вот такие чудеса.


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