Eloquent JavaScript



Download 2,16 Mb.
Pdf ko'rish
bet96/165
Sana09.07.2022
Hajmi2,16 Mb.
#762987
1   ...   92   93   94   95   96   97   98   99   ...   165
Bog'liq
Eloquent JavaScript

Improvised modules
Until 2015, the JavaScript language had no built-in module system. Yet people
had been building large systems in JavaScript for more than a decade, and they
needed
modules.
So they designed their own module systems on top of the language. You can
use JavaScript functions to create local scopes and objects to represent module
interfaces.
This is a module for going between day names and numbers (as returned
169


by
Date
’s
getDay
method). Its interface consists of
weekDay.name
and
weekDay
.number
, and it hides its local binding
names
inside the scope of a function
expression that is immediately invoked.
const weekDay = function() {
const names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
return {
name(number) { return names[number]; },
number(name) { return names.indexOf(name); }
};
}();
console.log(weekDay.name(weekDay.number("Sunday")));
// → Sunday
This style of modules provides isolation, to a certain degree, but it does not
declare dependencies. Instead, it just puts its interface into the global scope
and expects its dependencies, if any, to do the same. For a long time this was
the main approach used in web programming, but it is mostly obsolete now.
If we want to make dependency relations part of the code, we’ll have to take
control of loading dependencies. Doing that requires being able to execute
strings as code. JavaScript can do this.
Evaluating data as code
There are several ways to take data (a string of code) and run it as part of the
current program.
The most obvious way is the special operator
eval
, which will execute a
string in the
current
scope. This is usually a bad idea because it breaks some
of the properties that scopes normally have, such as it being easily predictable
which binding a given name refers to.
const x = 1;
function evalAndReturnX(code) {
eval(code);
return x;
}
console.log(evalAndReturnX("var x = 2"));
// → 2
console.log(x);
170


// → 1
A less scary way of interpreting data as code is to use the
Function
con-
structor. It takes two arguments: a string containing a comma-separated list
of argument names and a string containing the function body. It wraps the
code in a function value so that it gets its own scope and won’t do odd things
with other scopes.
let plusOne = Function("n", "return n + 1;");
console.log(plusOne(4));
// → 5
This is precisely what we need for a module system. We can wrap the
module’s code in a function and use that function’s scope as module scope.

Download 2,16 Mb.

Do'stlaringiz bilan baham:
1   ...   92   93   94   95   96   97   98   99   ...   165




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish