Me: примеры (JAVASCRIPT)

Использование me в JavaScript: примеры и особенности
Раздел: Примеры кода, Контекст выполнения
me(parameters): return_type

Основы функции me

В стандартном JavaScript нет встроенной функции с именем me. Однако, в ряде библиотек или пользовательских реализациях, например, в более старых версиях MooTools, функция $me или просто me могла использоваться как сокращение для document.getElementById или как метод для получения текущего элемента в контексте события. В современной практике под «функцией me» часто подразумевают пользовательскую функцию-обёртку для сохранения контекста выполнения (this).

Такая функция обычно используется для фиксации текущего значения this, чтобы его можно было использовать внутри других функций, например, обработчиков событий или асинхронных колбэков, где контекст меняется. Аргументов у подобной функции, как правило, нет. Она возвращает заранее сохранённое значение контекста.

Простые примеры использования

Создание и использование функции me для сохранения контекста.

const obj = {
    value: 'Привет',
    getMe: function() {
        const me = this; // Сохраняем контекст
        return function() {
            return me.value; // Используем сохранённый контекст
        };
    }
};
const func = obj.getMe();
console.log(func());
Привет

Использование в обработчике события.

class Button {
    constructor(text) {
        this.text = text;
        this.element = document.createElement('button');
        this.element.textContent = text;
        this.element.addEventListener('click', this.onClick.bind(this)); // Альтернатива с bind
    }
    onClick() {
        const me = this; // Сохраняем контекст
        setTimeout(function() {
            console.log(me.text);
        }, 100);
    }
}
const btn = new Button('Клик');
// document.body.appendChild(btn.element);
// При клике выведет: Клик

Альтернативные методы в JavaScript

  • Function.prototype.bind() – Создаёт новую функцию, которая при вызове имеет заданное значение this. Предпочтительнее, когда нужно сразу создать функцию с привязанным контекстом.
  • Стрелочные функции (=>) – Не имеют своего this и лексически захватывают значение this из окружающего контекста. Это самый современный и лаконичный способ.
  • Function.prototype.call() / apply() – Немедленно вызывают функцию с указанным контекстом. Используются, когда контекст нужно задать на момент вызова, а не создавать новую функцию.

Аналоги в других языках программирования

Python: Использует явную передачу self в методы. Для создания функций с фиксированным контекстом используют functools.partial или лямбда-выражения.

from functools import partial
class MyClass:
    def __init__(self, val):
        self.val = val
    def show(self):
        print(self.val)
obj = MyClass('Hi')
bound_func = partial(obj.show)
bound_func()
Hi

PHP: Для сохранения контекста часто используют замыкание с переменной $this или метод Closure::bind.

class Example {
    private $value = 'Hello';
    public function getClosure() {
        $self = $this;
        return function() use ($self) {
            echo $self->value;
        };
    }
}
$obj = new Example();
$func = $obj->getClosure();
$func();
Hello

C#: Проблема потерянного контекста решается через использование лямбда-выражений, которые автоматически захватывают текущий this.

Типичные ошибки

Потеря контекста при использовании функции в качестве колбэка.

const user = {
    name: 'Иван',
    greet: function() {
        console.log(this.name);
    }
};
setTimeout(user.greet, 100); // Ошибка: this будет undefined (в strict mode) или window
undefined

Неправильное использование внутри цепочки методов, когда me уже переопределено.

const obj = {
    value: 1,
    increment: function() {
        const me = this;
        me.value++;
        return me;
    },
    log: function() {
        console.log(this.value);
    }
};
obj.increment().log(); // Работает, т.к. методы возвращают this
// Но если внутри increment сделать me = somethingElse, произойдёт ошибка.
2

Эволюция подхода

Сам паттерн сохранения контекста в переменную me (или self, that) был широко распространён до появления стандарта ES6 (2015). С введением стрелочных функций необходимость в таком явном сохранении значительно снизилась. Стрелочные функции автоматически сохраняют лексический this, делая код чище и менее подверженным ошибкам.

Расширенные примеры

Использование me в каррированных функциях и функциях высшего порядка.

Пример javascript
function createMultiplier(factor) {
    const me = { factor }; // Сохраняем объект с данными
    return function(number) {
        return number * me.factor;
    };
}
const double = createMultiplier(2);
console.log(double(5));
10

Паттерн «модуль» с приватными переменными через замыкание.

Пример javascript
const counter = (function() {
    let privateCount = 0;
    const me = {
        increment: function() {
            privateCount++;
            return me.current();
        },
        current: function() {
            return privateCount;
        }
    };
    return me;
})();
console.log(counter.increment());
console.log(counter.current());
1
1

Использование в асинхронном коде до появления async/await.

Пример javascript
function DataFetcher(url) {
    this.url = url;
}
DataFetcher.prototype.fetch = function() {
    const me = this;
    return new Promise(function(resolve) {
        // Имитация запроса
        setTimeout(function() {
            resolve('Данные с ' + me.url);
        }, 50);
    });
};
const fetcher = new DataFetcher('https://api.example.com');
fetcher.fetch().then(console.log);
Данные с https://api.example.com

JS me function comments

En
Me description