ساخت توابع در جاوا اسکریپت به صورت داینامیک

شنبه 16 اسفند 1399

در این مقاله یاد می‌گیریم تا توابع داینامیک را بلافاصله از رشته ها ایجاد کنیم.

ساخت توابع در جاوا اسکریپت به صورت داینامیک

تابع بلوک اصلی ساخت در جاوا اسکریپت است. یک تابع شامل گروهی از عبارات است که وظیفه خاصی را انجام می‌دهد. یک تابع می‌تواند ووردی را به شکل پارامترها بپذیرد و خروجی را با استفاده از دستور return تولید کند.

ساخت تابع بسیار ساده است. در درجه اول، دو روش برای ساخت تابع وجود دارد.

اعلان تابع


    function square(num) {    
        return num * num;    
    } 

همانطور که در مثال فوق مشاهده می‌کنید تابع square یک پارامتر به نام num می‌گیرد و مربع آن عدد را برمی‌گرداند.

عبارت تابع (Function Expression)

اعلان تابع فوق را می‌توان در عبارتی مانند زیر نشان داد:


    function square(num) {    
        return num * num;    
    } 

همچنین می‌توانید از arrow function برای ساخت عبارت تابع استفاده کنید:


    const square = function(num) {    
        return num * num;    
    }

چیزی که ما باید در نظر بگیریم این است که هر تابعی که در جاوا اسکریپت ساخته می‌شود نمونه‌ای از آبجکت Function است.

function square(num) {    
    return num * num;    
}  
console.log(square instanceof Function)  
// output: true
const square = function(num) {    
    return num * num;    
}  
console.log(square instanceof Function)  
// output: true 

    const square = function(num) {    
        return num * num;    
    }  
    console.log(square instanceof Function)  
    // output: true  

ساخت تابع داینامیک

سینتکس

آبجکت Function همچنین می‌تواند به عنوان کانستراکتور تابع برای ساخت بلافاصله یک تابع جدید استفاده شود. سینتکس ساخت تابع از آبجکت Function به شرح زیر است:

const myFunction = new Function(arg1, arg2, …argN, body); 

args1، args2،...، argsN آرگومان‌های پذیرفته شده توسط تابع هستند و بدنه رشته‌ای متشکل از عبارات جاوا اسکریپت است که با فراخوانی تابع اجرا می‌شود.

مثال‌‌ها

بیایید سریعا این را با جزئیات به کمک یک مثال بررسی کنیم.


    const sq = new Function('num', 'return num * num');   
    sq(2); // output: 4

در قطعه کد بالا، تابعی را ساخته‌ایم که یک پارامتر "num" را می‌گیرد و مربع عدد را برمی‌گرداند.

بیاید یک مثال دیگر را بررسی کنیم. تابع زیر دو تا پارامتر x و y را می‌گیرد و نتیجه ضرب این دو عدد را برمی‌گرداند.

const multiply = new Function('x', 'y', 'return x * y');  
multiply(2, 5); // output: 10

همچنین می‌توانیم تابعی را بسازیم که هیچ پارامتری نمی‌گیرد.

const logger = new Function('console.log("hello javascript")')  
logger(); //output: hello javascript

همچنین می‌توانید بدنه تابع را در چند خط با استفاده از الگوی es6 بنویسید.

const square = new Function('numbers', `  
    return numbers  
            .map(num => num * num)  
`);

مورد دیگری که باید در ذهن داشته باشید ساخت تابع با new Function است که در محدوده سراسری ساخته می‌شوند و قادر به دسترسی به محیط واژگانی (lexical) فعلی نیستند.

از این روی این تابع از محیط واژگان خارجی آن به متغیرها دسترسی ندارد.

function myFunc() {    
  const num = 2;    
    
  const sq = new Function('return num * num');    
    
  return sq;    
}     
    
myFunc()();  
// output: Uncaught ReferenceError: num is not defined

با این حال، اعلان‌های توابع به محیط بیرونی آن دسترسی دارند.

function myFunc() {  
  const num = 2;  
  
  const sq = function() { return num * num }  
  
  return sq;  
}   
  
myFunc()();  
// output: 4

این ویژگی به ندرت مورد نیاز است اما می‌تواند در شرایط خاص غیر قابل اجتناب باشد. تصور کنید شما در حال ساخت برنامه‌های پیچیده مبتنی بر وب هستید و منطق را به صورت کد در محیط سمت سرور ذخیره کرده‌اید و می‌خواهید با استفاده از این منطق توابع را تولید کنید.

نکته قابل توجه این است که جدا از این شرایط کمیاب از ساخت توابع داینامیک باید اجتناب شود زیرا کد را مستعد مشکلات عملکردی و امنیتی می‌سازد.

خلاصه

آبجکت Function می‌تواند به عنوان کانستراکتور تابع برای ساخت بلافاصله توابع داینامیک استفاده شود.

سینتکس

const myFunction = new Function(arg1, arg2, …argN, body);

مثال


    const sq = new Function('num', 'return num * num');  
    sq(4); output: 16  

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید