Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Область видимости переменных (this) (https://javascript.ru/forum/misc/45934-oblast-vidimosti-peremennykh.html)

Артем163 21.03.2014 14:22

Область видимости переменных (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". Может кто-нибудь из знатоков объяснить? Заранее благодарю :thanks:

nice_try 21.03.2014 14:34

сначала зис смотрит в окно а потом в фу

рони 21.03.2014 14:41

Артем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());

nerv_ 21.03.2014 15:01

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();

Sweet 21.03.2014 15:32

Потому что контекст функции определяется во время её вызова. Если функция принадлежит объекту, то 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();


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