از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
اجرای توابع جاوا اسکریپت از روی نام رشته ها
سرفصلهای مطلب
معرفی
جاوا اسکریپت یک زبان منعطف و قدرتمند است که روش های مختلفی را برای انجام تقریباً هر کاری، مانند فراخوانی توابع، ارائه می دهد. یکی از روشهای جالبتر و کمتر شناختهشده، فراخوانی یک تابع زمانی است که فقط نام آن را به عنوان رشته داشته باشید.
این بایت شما را از طریق process فراخوانی توابع جاوا اسکریپت از نام رشته ها و اینکه چرا ممکن است بخواهید این کار را انجام دهید.
فراخوانی تابع جاوا اسکریپت
قبل از اینکه به جزئیات فراخوانی توابع از نام رشته ها بپردازیم، بیایید نگاهی به روش فراخوانی توابع پایه جاوا اسکریپت بیندازیم. در JS، توابع با ضمیمه پرانتز فراخوانی می شوند ()
به نام تابع این را می توان به طور مستقیم انجام داد، همانطور که در myFunction()
، یا به طور غیر مستقیم، همانطور که در myObject.myMethod()
.
function sayHello() {
console.log("Hello, world!");
}
sayHello(); // Outputs: Hello, world!
چرا توابع را از نام رشته احضار کنیم؟
اگر از قبل سناریوی سنجیدهای برای انجام این کار ندارید، تعجب میکنید که چرا اصلاً میخواهیم این کار را انجام دهیم. خوب، چند سناریو وجود دارد که این می تواند مفید باشد.
به عنوان مثال، ممکن است با یک API کار کنید که رشتهای را برمیگرداند که نشان میدهد کدام تابع باید اجرا شود، مانند فراخوانی روش از راه دور (RPC). یا، شاید شما در حال توسعه یک سیستم افزونه هستید که در آن افزونه ها عملکردهای خود را با نام ثبت می کنند و باید این توابع را به صورت پویا فراخوانی کنید.
در این موارد، امکان فراخوانی یک تابع از نام رشته آن می تواند ابزار قدرتمندی در برنامه شما باشد.
روش اصلی: با استفاده از شی پنجره
ابتدایی ترین راه برای فراخوانی یک تابع از نام رشته در جاوا اسکریپت استفاده از آن است window
هدف – شی. در یک محیط مرورگر، تمام توابع جاوا اسکریپت جهانی به روشهایی تبدیل میشوند window
هدف – شی. بنابراین، شما می توانید به این توابع به عنوان ویژگی های دسترسی داشته باشید window
با استفاده از نماد براکت
در اینجا یک مثال ساده آورده شده است:
function greet() {
console.log("Hello, world!");
}
var functionName = "greet";
window(functionName)(); // Outputs: Hello, world!
در این کد، ما یک تابع را تعریف می کنیم greet
، سپس نام آن را به عنوان یک رشته در متغیر ذخیره کنید functionName
. سپس از نماد براکت برای دسترسی به این تابع به عنوان ویژگی استفاده می کنیم window
و آن را استناد کنید.
توجه داشته باشید: این روش فقط برای توابع جهانی در یک محیط مرورگر کار می کند. برای توابع محلی یا در محیط های غیر مرورگر مانند Node.js کار نمی کند.
روش پیشرفته: با استفاده از جاوا اسکریپت eval() تابع
یک روش پیشرفته تر (و بحث برانگیز) برای فراخوانی یک تابع از نام رشته، استفاده از جاوا اسکریپت است. eval()
تابع. را eval()
تابع یک رشته کد جاوا اسکریپت را می گیرد و آن را اجرا می کند. این بدان معنی است که می توانید رشته ای بسازید که نشان دهنده فراخوانی تابعی است که می خواهید انجام دهید و eval()
آن را اجرا خواهد کرد.
در اینجا روش انجام این کار آمده است:
function greet() {
console.log("Hello, world!");
}
var functionName = "greet";
eval(functionName + "()"); // Outputs: Hello, world!
در این مثال، ما رشته را به هم متصل می کنیم "()"
به نام تابع و ارسال رشته حاصل به eval()
. این باعث می شود eval()
برای اجرای فراخوانی تابع به گونه ای که گویی یک خط از کد جاوا اسکریپت است.
توجه داشته باشید: استفاده کنید eval()
با احتیاط! از آنجایی که کدهای جاوا اسکریپت دلخواه را اجرا می کند، در صورت استفاده نادرست می تواند خطرات امنیتی جدی ایجاد کند. همیشه هر ورودی را که به آن ارسال می کنید تأیید و ضدعفونی کنید eval()
.
روش جایگزین: با استفاده از سازنده تابع
راه دیگر برای اجرای یک تابع از نام رشته در جاوا اسکریپت استفاده از سازنده Function است. این روش کمی پیشرفته تر است، اما انعطاف پذیری زیادی را ارائه می دهد.
در اینجا روش کار آن آمده است:
let functionName = "sayHello";
let functionArguments = ("John");
let functionBody = 'console.log("Hello, " + name + "!");';
let func = new Function('name', functionBody);
func.apply(null, functionArguments);
در مثال بالا یک تابع جدید با the ایجاد می کنیم Function
سازنده سازنده تعداد متغیری از آرگومان ها را می گیرد. آخرین آرگومان بدنه تابع به عنوان یک رشته است و آرگومان های قبلی نام آرگومان های تابع هستند.
پس از ایجاد تابع، می توانیم با استفاده از آن آن را فراخوانی کنیم apply()
روش، ارسال آرگومان ها به عنوان یک آرایه.
صبر کن! استفاده کردن new Function
مانند این برای فراخوانی کد از یک رشته خطرناک است. این برنامه شما را در برابر انواع مشکلات امنیتی احتمالی باز می کند. شما فقط باید از این روش به عنوان آخرین راه حل استفاده کنید.
اجرای توابع فضای نام
گاهی اوقات، توابع سراسری نیستند، اما درون اشیاء یا فضای نامی تودرتو هستند. در چنین مواردی، ما همچنان می توانیم با دسترسی به ویژگی های شی، آنها را اجرا کنیم.
به مثال زیر توجه کنید:
let myNamespace = {
myFunction: function(name) {
console.log('Hello, ' + name + '!');
}
};
let functionName = "myFunction";
let functionArguments = ("John");
myNamespace(functionName).apply(myNamespace, functionArguments);
در این مثال، myFunction
یک خاصیت از است myNamespace
هدف – شی. ما می توانیم با استفاده از علامت براکت به آن دسترسی داشته باشیم و سپس آن را با علامت فراخوانی کنیم apply()
روش.
اما اگر نام تابع در علامت نقطه مشخص شده بود چه؟ برای انجام این کار، باید نام شی/توابع را بر اساس نقطه تقسیم کنید و قبل از فراخوانی تابع به هر شیء دسترسی داشته باشید. این را می توان با عملکردی مانند زیر به دست آورد:
let myNamespace = {
functions: {
hello: function(name) {
console.log('Hello, ' + name + '!');
}
}
};
let functionName = "functions.hello";
let context = myNamespace;
let namespaces = functionName.split(".");
let func = namespaces.pop();
for (let i = 0; i < namespaces.length; i++) {
context = context(namespaces(i));
}
return context(func).apply(context, args);
با استفاده از این، می توانیم توابعی با عمق فضای نام دلخواه را اجرا کنیم.
ملاحظات امنیتی
در حالی که این روش ها می توانند بسیار مفید باشند، مهم است که این را به خاطر بسپارید اجرای کد از یک رشته می تواند یک خطر امنیتی باشد. این به ویژه در هنگام استفاده از eval()
تابع یا Function
سازنده، زیرا آنها هر کد جاوا اسکریپت را اجرا می کنند. اگر با ورودی کاربر سروکار دارید، این اراده منجر به حملات تزریق کد می شود.
توجه داشته باشید: همیشه قبل از استفاده از ورودی کاربر در کد خود، آن را تأیید و پاکسازی کنید. تا حد امکان از اجرای کد از رشته ها خودداری کنید.
نتیجه
در این بایت، ما چند روش مختلف برای اجرای یک تابع جاوا اسکریپت زمانی که نام آن را به صورت رشته ای دارید، نشان داده ایم. ما روش استفاده از window
شیء، Function
سازنده، و حتی روش اجرای توابع در فضای نام. در حالی که این تکنیک ها می توانند مفید باشند، استفاده مسئولانه از آنها برای جلوگیری از خطرات امنیتی بالقوه مهم است.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1402-12-28 20:45:02