جافاسكريبت - شرح مساحة الاسم في تايب سكريبت المترجمة (العمل الداخلي لمساحة الاسم)


أحاول أن أفهم كيف يمكن تنفيذ مساحة الأسماء في جافاسكريبت. أنا أتحقق من كيفية إعلان مساحة أسماء في جافاسكريبت؟

ذكر أحد الإجابات كود TypeScript التالي.

namespace Stack {
    export const hello = () => console.log('hi')
}

Stack.hello()

يتم تجميعه إلى جافا سكريبت التالية

var Stack;
(function (Stack) {
    Stack.hello = () => console.log('hi');
})(Stack || (Stack = {}));

ومع ذلك، أجد صعوبة في فهم الصياغة أعلاه، هل يمكن لشخص ما أن يشرح كيف تعمل؟ على سبيل المثال، كيف تعمل الصياغة التالية؟

(function(Stack) {...})(...)
(Stack || (Stack = {}))

الإجابة رقم 1

var Stack;
(function (Stack) {
    Stack.hello = () => console.log('hi');
})(Stack || (Stack = {}));

Stack.hello();

إنها دالة مجهولة التنفيذ ذاتيًا. يمكنك الاطلاع على هذا المستند للحصول على بعض الأفكار.

لنسخة أكثر فهمًا، يمكنك تخيلها كما هو موضح أدناه

var Stack;

//naming the function
//`Stack` here is not related to the global `Stack` because the function parameter scopes this variable
function anonymousFunction(Stack) {
    Stack.hello = () => console.log('hi');
}

//replace for `Stack || (Stack = {})`
if(!Stack) {
   Stack = {} //it's a reference value, so if we have any changes inside a function, it will be applied to `Stack` as well
}

//execute the function/namespace to add `hello` to `Stack`
anonymousFunction(Stack); 

Stack.hello();