Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > чем отличается call(this) от call()


Автор: Сisa 2.2.2015, 17:45
Тут habrahabr.ru/post/199456/  связывается функция с контекстом: var bound = returnFoo.bind(context);

Два моих варианта кода:
Код

(function() {
 alert(1)
}).call(this)


Код

(function() {
 alert(1)
}).call()

оба выполняются, непонятна роль this в первом, и возможность отсутствия this/объекта/контекста во втором варианте.
Чем отличаются эти две записи?

Автор: diadiavova 2.2.2015, 23:54
Попробуй так
Код


        function showValue ()
        {
            alert(this.value);
        }
        showValue.call();
        var value = "qwerty"
        showValue.call();
        showValue.call({value:"Привет"});


Автор: Сisa 3.2.2015, 19:53
diadiavova спасибо! я почти понял :
Код

function showValue (){
 alert(this.value);
}
showValue.call();//понятно что ничего не выдаст, т.к. value еще нигде не фигурирует
var value = "qwerty";//так это же глобальная переменная, ее и покажет
showValue.call();// покажет глобальную переменную value, т.к. this в данном случае документ
showValue.call({value:"Привет"});//а здесь передается в контексте объект со свойством value, которое равно Привет
showValue.call(this);// а так "qwerty"

однако этот this все равно какой то "тугой" для нормального восприятия  smile
Код

function showValue2(){
 var x=1;
 this.x=2;
}
showValue2.call();
alert(x);
//showValue2.call(this);
//alert(x);


Автор: diadiavova 3.2.2015, 21:26
Цитата(Сisa @  3.2.2015,  19:53 Найти цитируемый пост)
т.к. this в данном случае документ

window. Все переменные и функции, объявленные на глобальном уровне становятся полями объекта window и в данном случае this тоже будет ссылаться на него.
Цитата(Сisa @  3.2.2015,  19:53 Найти цитируемый пост)
а здесь передается в контексте объект со свойством value, которое равно Привет

Ну то есть, что передашь функции колл, на то и будет ссылаться this внутри вызываемой функции.
Цитата(Сisa @  3.2.2015,  19:53 Найти цитируемый пост)
Код

function showValue2(){
 var x=1;
 this.x=2;
}
showValue2.call();
alert(x);

Код не запускал, но рискну предположить, что алерт выдаст 2. Локальная переменная икс за пределами функции не видна, поэтому попытки достучаться до нее оттуда ни к чему не приведут. Когда ты выполняешь функцию, то выполняется this.x = 2, а поскольку контекст ты не задал, то this будет ссылаться на window, стало быть в этом контексте следующие строки будут эквивалентны
Код

this.x = 2;
window.x = 2;

А последняя, в свою очередь, по причине, которую я объяснил выше будет равнозначна такому объявлению на глобальном уровне
Код

var x = 2;

Собственно, исходя из этих рассуждений, я и  думаю, что твой алерт должен выдать двойку.

Автор: Сisa 3.2.2015, 22:31
diadiavova  я Вам благодарен за разъяснение! Понимаю что Вы мне говорите, т.к. не раз уже перечитывал об этом самом this, и что такое локальная и глобальная переменная, и что они отличаются областью видимости, и временем жизни, и что есть замыкание, и есть инкапсуляция,  но в данной записи, когда аргументы в функцию не передаются, моск попросту сопротивляется и автоматом напрочь отказывается понимать smile

Спасибо!

(конечно 2 и конечно window)

__________________



" что передашь функции колл, на то и будет ссылаться this внутри вызываемой функции. " - это надо в учебниках написать, и все сразу будет понятно  !!!!!!!!!! 

Автор: _zorn_ 4.2.2015, 03:29
Я бы не стал использовать такой код в своих приложениях.
И бил бы по пальцам тех кто пытается запутать других, показав себя умным....

Яваскрипт не без изъянов, но давайте выставим их все напоказ что ли ?
Неужели нельзя использовать всем понятные конструкции ?

Автор: diadiavova 4.2.2015, 11:38
Цитата(_zorn_ @  4.2.2015,  03:29 Найти цитируемый пост)
Я бы не стал использовать такой код в своих приложениях.

Какой именно?
Цитата(_zorn_ @  4.2.2015,  03:29 Найти цитируемый пост)
И бил бы по пальцам тех кто пытается запутать других, показав себя умным....

В теме рассматривались простейшие аспекты использования стандартной функции языка. Ты действительно полагаешь, что всякий, кто ее использует, делает это исключительно с целью показать себя слишком умным запутать тебя? Это тебя настолько раздражает, что тебе хочется наносить таким людям увечья? Хочешь поговорить об этом? smile 
Цитата(_zorn_ @  4.2.2015,  03:29 Найти цитируемый пост)
Яваскрипт не без изъянов

О каких изъянах речь в данном случае?
Цитата(_zorn_ @  4.2.2015,  03:29 Найти цитируемый пост)
но давайте выставим их все напоказ что ли ?

Предлагаешь скрывать правду? smile 
Цитата(_zorn_ @  4.2.2015,  03:29 Найти цитируемый пост)
Неужели нельзя использовать всем понятные конструкции ? 

Конструкций, понятных всем, не существует. Понятно тебе будет только то, в чем ты дал себе труд разобраться.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)