Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

JavaScript, this, call, apply

with one comment

Тут піде мова про елементарні речі, про які обов’язково розповідає будь-який підручник JavaScript, але я все одно забуваю. Тому запишу аби запам’ятати легше було. Спершу – яка різниця між call та apply?

Як apply, так і call дозволяють нам викликати нашу функцію зі зміненим контекстом, незалежно від того звідки ми її взяли. Єдина відмінність у способі виклику. f.apply(context, arg_array) приймає два аргументи: контекст, та масив аргументів. f.call(context, arg1, arg2, ...) приймає n+1 аргумент – контекст, та n аргументів з якими треба викликати функцію.

Що таке контекст? Контекст, це те що кожна функція отримує за допомогою спеціальної змінної this. За замовчуванням this містить посилання на глобальний об’єкт window. Ось нехай ми маємо таку функцію:

function hello() {
    console.log('Hello ' + this.name);
}
hello()
// отримаємо: Hello
// тому що this.name - undefined
name = 'world' // те саме що window.name = window 
// Всі змінні за замовчуванням створюються в глобальному об’єкті
hello()
// отримаємо: Hello world
// тому що this.name, це те саме що window.name
// а hello() це те саме що window.hello(). Он як!

Тепер подивимось які ще бувають контексти. Створимо об’єкт з атрибутом та методом:

x = {name: 'x', hello: hello}
x.hello()
// отримаємо: Hello x

Значить всі функції описуються як методи об’єкта window, якщо вони не прив’язані до якогось іншого об’єкта. Ах, ще функції – самі по собі об’єкти, тому можна зробити якось так:

hello.hello = hello // атрибутом hello функції hello буде функція hello
hello.hello()
// отримаємо: Hello hello
// Тому що атрибут name функції містить її ім’я

Хоча останній хак – не описаний в стандартах.

А взагалі, в кінці дня я вже трішки плутаюсь між this та self, та між прототипним ООП і метакласами…

Advertisements

Written by bunyk

Червень 19, 2013 at 19:14

Оприлюднено в Кодерство, Павутина

Tagged with

Одна відповідь

Subscribe to comments with RSS.

  1. Нічого складного, концептуально this – то спосіб встроїти state-монаду в твій код, а call/apply – підняти і виконати функцію у відповідній state-монаді 🙂 (а сама монада встроєна в мову якщо що)

    От continuation-монади в javascript-і – це вже серйозніше і можна розвернутися краще 🙂

    zzz

    Червень 25, 2013 at 10:42


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: