Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.03.2014, 12:22
Интересующийся
Отправить личное сообщение для Артем163 Посмотреть профиль Найти все сообщения от Артем163
 
Регистрация: 16.09.2013
Сообщений: 11

Область видимости переменных (this)
Всем привет!

В тесте встретил вот такой скрипт:
var x = 3;

var foo = {
    x: 2,
    baz: {
        x: 1,
        bar: function() {
            return this.x;
        }
    }
};

var go = foo.baz.bar;

alert(go());
alert(foo.baz.bar());


И мне не совсем понятно, почему в итоге алерт покажет "3" затем "1". Может кто-нибудь из знатоков объяснить? Заранее благодарю
Ответить с цитированием
  #2 (permalink)  
Старый 21.03.2014, 12:34
Аватар для nice_try
Профессор
Отправить личное сообщение для nice_try Посмотреть профиль Найти все сообщения от nice_try
 
Регистрация: 11.12.2013
Сообщений: 313

сначала зис смотрит в окно а потом в фу
Ответить с цитированием
  #3 (permalink)  
Старый 21.03.2014, 12:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 32,274

Артем163,
может так вам что-то прояснит
var x = 3;
var foo = {
    x: 2,
    baz: {
        x: 1,
        bar: function() {
            alert(this)
            return this.x;
        }
    }
};

var go = foo.baz.bar;

alert(go());
alert(foo.baz.bar());

и это
var x = 3;
var foo = {
    x: 2,
    baz: {
        x: 1,
        bar: function() {
            return this.x;
        }
    }
};

var go = function() {
            return this.x;
        };

alert(go());
alert(foo.baz.bar());
Ответить с цитированием
  #4 (permalink)  
Старый 21.03.2014, 13:01
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

var x = 3;

var foo = {
    x: 2,
    baz: {
        x: 1,
        bar: function() {
            alert(showThis.call(this));
            return this.x;
        }
    }
};

var go = foo.baz.bar;

function showThis() {
    return this === window ? '[object global]' : JSON.stringify(this);
}


go();
foo.baz.bar();
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 21.03.2014, 13:32
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Потому что контекст функции определяется во время её вызова. Если функция принадлежит объекту, то this будет ссылаться на него, иначе - на глобальный объект:
function test () {
  alert(this.property);
}

var x = {
  test: test, property: "x"
};

var y = {
  test: test, property: "y"
};

window.property = "window";

x.test();
y.test();
test();
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пож с JSON, передача id ссылки. wisma jQuery 22 10.02.2014 13:36
Область видимости переменных positiveman Общие вопросы Javascript 3 14.01.2013 13:08
область видимости переменных в prototype (тупой вопрос)) stnw Общие вопросы Javascript 3 11.02.2011 18:25
область видимости переменных jetli13 Общие вопросы Javascript 3 17.09.2010 10:00
можно ли включить функцию в глобальную область видимости из файла maxval Элементы интерфейса 13 04.10.2009 06:11