Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замена IIFE ??? (https://javascript.ru/forum/misc/84960-zamena-iife.html)

stig85 16.02.2023 16:25

Замена IIFE ???
 
Всем привет!
Постараюсь упростить свою задачу и кратко описать суть проблемы.
Есть переменная (функция), которая должна возвращать значение другой внешней переменной. Обращаться надо как к простой переменной, т.е. без скобок (собственно в этом и затык).
Если без скобок, то это что-то вроде IIFE и получается так:
let message = "Hello!";

let res = (() => message)();

console.log(res);


И вроде все как надо, но только при изменении внешней переменной мне надо получать это новое значение, а тут остается старое, потому как IIFE так и работает.
let message = "Hello!";

let res = (() => message)();

console.log(res);

message = "world!";

console.log(res);


Может быть есть изврат, чтобы реализовать такую задачу?
Заранее спасибо откликнувшимся

Nexus 16.02.2023 16:59

Зачем вам IIFE (Immediately Invoked Function Expression)?
В вашем примере вам даже функция не нужна, достаточно прямого обращения к переменной.

stig85 16.02.2023 17:29

Цитата:

Сообщение от Nexus (Сообщение 550704)
Зачем вам IIFE (Immediately Invoked Function Expression)?
В вашем примере вам даже функция не нужна, достаточно прямого обращения к переменной.

Не, ну функция-то мне конечно нужна )
Это я для упрощения обозначил, что просто обращение к одной внешней переменной, а так-то мне вообще надо этой функцией определенным образом обрабатывать внешние переменные и давать результат. Если изменились переменные, то и другой результат. А обращаться к функции просто по имени без скобок (и не спрашивайте почему).
Вот тут дали наводку https://qna.habr.com/q/1253484

Aetae 16.02.2023 19:09

Цитата:

А обращаться к функции просто по имени без скобок
Как там тебе уже ответили - функция без скобок - не функция, а переменная.

Рефов в js пока не завезли, геттер на глобальный объект - только с глобальными переменными и сработает.

SanGorych 17.02.2023 11:49

Функция ВСЕГДА вызывается со скобками, а в вашем примере запись
let message = "Hello!";
let res = (() => message)();

равнозначна
let message = "Hello!";
let res = message;

Так что получается, "res" - это не функция а еще одна строка.
И при изменении "message", она естественно остается прежней.
Но если для вас не принципиально использование функции, то вы можете заменить её на свойство:
let message = "Hello!";
Object.defineProperty(this, 'res', {
    get() {
        //Здесь, если нужна, какая то логика
        return message;
    }
});
console.log(res);
message = "world!";
console.log(res);


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