Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.02.2016, 01:06
Аспирант
Отправить личное сообщение для Gerd199 Посмотреть профиль Найти все сообщения от Gerd199
 
Регистрация: 03.02.2016
Сообщений: 88

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


Что делать и как ее сохранить?
Ответить с цитированием
  #2 (permalink)  
Старый 12.02.2016, 02:01
Аспирант
Отправить личное сообщение для Gerd199 Посмотреть профиль Найти все сообщения от Gerd199
 
Регистрация: 03.02.2016
Сообщений: 88

more_apps - относительно другой переменой, почему и что делать?
Ответить с цитированием
  #3 (permalink)  
Старый 12.02.2016, 03:12
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

А для forEach указать this не пробовал? Точнее для callback.
Ответить с цитированием
  #4 (permalink)  
Старый 12.02.2016, 03:56
Аспирант
Отправить личное сообщение для Gerd199 Посмотреть профиль Найти все сообщения от Gerd199
 
Регистрация: 03.02.2016
Сообщений: 88

Сообщение от Decode Посмотреть сообщение
А для forEach указать this не пробовал? Точнее для callback.
Как?
Ответить с цитированием
  #5 (permalink)  
Старый 12.02.2016, 18:00
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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


Что делать и как ее сохранить?
http://habrahabr.ru/post/149581/
Ответить с цитированием
  #6 (permalink)  
Старый 12.02.2016, 18:13
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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).

Последний раз редактировалось Erolast, 12.02.2016 в 18:17.
Ответить с цитированием
  #7 (permalink)  
Старый 12.02.2016, 23:27
Интересующийся
Посмотреть профиль Найти все сообщения от nodequest
 
Регистрация: 31.01.2016
Сообщений: 17

Не слушайте предыдущего оратора, от тут в качестве потешного, который тужится всем показать, что он что-то понимает Ключевое слово this выполняет роль динамической ссылки на контекст вызова. Само сабой, он не в "каждой ф-ции свой", а для каждого вызова свой, он резольвиться в рантайме, подробней можете почитать о динамическом связывании (это оно), например, в Смоллток.
Ответить с цитированием
  #8 (permalink)  
Старый 12.02.2016, 23:34
Интересующийся
Посмотреть профиль Найти все сообщения от nodequest
 
Регистрация: 31.01.2016
Сообщений: 17

Сообщение от Gerd199
Что делать и как ее сохранить?
Для Вашего случая, проще всего явно указывать window/global вместо this. Вообще, ваша конструкция семантически правильна, с точки зрения языка она должна работать, тут просто кривизна/закидоны конкретных реализаций дают о себе знать.
Ответить с цитированием
  #9 (permalink)  
Старый 13.02.2016, 08:24
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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

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

При вызове глобальной функции 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 резолвится в перебираемый массив.

Последний раз редактировалось Erolast, 13.02.2016 в 08:27.
Ответить с цитированием
  #10 (permalink)  
Старый 13.02.2016, 12:56
hhh hhh вне форума
Профессор
Отправить личное сообщение для hhh Посмотреть профиль Найти все сообщения от hhh
 
Регистрация: 19.11.2013
Сообщений: 150

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пропадает переменная jeep44 Общие вопросы Javascript 2 27.04.2015 19:07
глобальная переменная jquery imediasun1 Элементы интерфейса 2 05.01.2014 20:30
.trigger() и глобальная переменная madicom jQuery 1 25.12.2011 16:53
Глобальная переменная в функции Орёл Общие вопросы Javascript 1 18.12.2010 20:21
Глобальная переменная vah-smile Общие вопросы Javascript 3 06.07.2010 12:41