Facebook Pixel
Searching...
فارسی
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Functional JavaScript

Functional JavaScript

Introducing Functional Programming with Underscore.js
توسط Michael Fogus 2013 258 صفحات
4.07
100+ امتیازها
گوش دادن
Listen to Summary

نکات کلیدی

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

یک تابع درجه یک تابعی است که می‌تواند در هر جایی که هر مقدار دیگری می‌تواند قرار گیرد—محدودیت‌های کمی وجود دارد.

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

  • اختصاص یک تابع به یک متغیر: var square = function(x) { return x * x; }
  • انتقال یک تابع به عنوان آرگومان: [1, 2, 3].map(function(x) { return x * 2; })
  • بازگرداندن یک تابع: function makeAdder(x) { return function(y) { return x + y; }; }

این ویژگی درجه یک توابع، پایه‌گذار بسیاری از الگوهای برنامه‌نویسی تابعی در جاوااسکریپت است.

2. توابع مرتبه بالاتر کلید برنامه‌نویسی تابعی در جاوااسکریپت هستند

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

انتزاعات قدرتمند. توابع مرتبه بالاتر یا توابع را به عنوان آرگومان می‌پذیرند یا توابع را به عنوان نتیجه بازمی‌گردانند. این امکان را برای انتزاعات قدرتمند و استفاده مجدد از کد فراهم می‌کند. مثال‌های رایج شامل:

  • map: تبدیل هر عنصر در یک مجموعه
  • reduce: ترکیب عناصر یک مجموعه به یک مقدار واحد
  • filter: انتخاب عناصر از یک مجموعه بر اساس یک پیش‌شرط

این توابع به شما اجازه می‌دهند عملیات پیچیده را به طور مختصر بیان کنید و رفتارها را ترکیب کنید. به عنوان مثال:

const numbers = [1, 2, 3, 4, 5];
const evenSquares = numbers
  .filter(x => x % 2 === 0)
  .map(x => x * x);

این کد به وضوح نیت انتخاب اعداد زوج و مربع کردن آن‌ها را بیان می‌کند، بدون اینکه به طور صریح حلقه‌ها یا آرایه‌های میانی را مدیریت کند.

3. بستن‌ها تکنیک‌های قدرتمند تابعی را در جاوااسکریپت امکان‌پذیر می‌سازند

یک بستن، تابعی است که پیوندهای خارجی (یعنی نه آرگومان‌های خود) را که در دامنه‌ای که در آن تعریف شده است برای استفاده بعدی (حتی پس از اتمام آن دامنه) در بر می‌گیرد.

محصورسازی و حالت. بستن‌ها به توابع اجازه می‌دهند که متغیرها را از دامنه خارجی خود "به خاطر بسپارند" و به آن‌ها دسترسی داشته باشند، حتی پس از اتمام اجرای آن دامنه. این امکان را فراهم می‌کند:

  • حالت خصوصی: ایجاد متغیرهایی که تنها از طریق توابع خاص قابل دسترسی هستند
  • کارخانه‌های تابعی: تولید توابع تخصصی بر اساس پارامترها
  • کاربرد جزئی: ایجاد توابع جدید با ثابت کردن برخی آرگومان‌های توابع موجود

مثالی از یک بستن که حالت خصوصی را حفظ می‌کند:

function counter() {
  let count = 0;
  return function() {
    return ++count;
  };
}

const increment = counter();
increment(); // 1
increment(); // 2

متغیر count به طور مستقیم قابل دسترسی نیست، اما تابع بازگشتی می‌تواند به آن دسترسی پیدا کند و آن را تغییر دهد.

4. ترکیب توابع اجازه می‌دهد رفتارهای پیچیده از اجزای ساده ساخته شوند

برنامه‌نویسی تابعی درباره جدا کردن برنامه‌ها و دوباره سرهم کردن آن‌ها از همان اجزا، که پشت مرزهای تابعی انتزاع شده‌اند، است.

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

  • ایجاد رفتارهای پیچیده از اجزای ساده و قابل استفاده مجدد
  • بهبود خوانایی کد با شکستن عملیات پیچیده
  • افزایش قابلیت نگهداری با جداسازی و آزمایش واحدهای کوچک‌تر عملکرد

ترکیب می‌تواند از طریق روش‌های مختلفی انجام شود:

  • ترکیب دستی: const f = x => h(g(x))
  • توابع کمکی: const compose = (f, g) => x => f(g(x))
  • کتابخانه‌هایی مانند Ramda یا Lodash/FP

مثالی از ساخت یک خط پردازش داده از طریق ترکیب:

const processData = compose(
  summarize,
  filterOutliers,
  normalize,
  parseInput
);

این به وضوح مراحل پردازش داده را بدون شلوغ کردن کد با جزئیات پیاده‌سازی نشان می‌دهد.

5. توابع خالص و عدم تغییر منجر به کدهای قابل پیش‌بینی‌تر می‌شوند

برنامه‌نویسی با توابع خالص ممکن است به شدت محدودکننده به نظر برسد. [...] با این حال، زمانی که دیدگاه لیبرالی نسبت به تغییر حالت را اعمال می‌کنید، در واقع امکانات خود را در ترکیب محدود می‌کنید، توانایی خود را برای استدلال در مورد اثرات هر بیانیه خاص پیچیده‌تر می‌کنید و آزمایش کد خود را دشوارتر می‌سازید.

قابلیت پیش‌بینی و آزمایش‌پذیری. توابع خالص همیشه برای ورودی‌های مشخص همان خروجی را تولید می‌کنند و هیچ اثر جانبی ندارند. این، همراه با داده‌های غیرقابل تغییر:

  • استدلال درباره رفتار کد را ساده‌تر می‌کند
  • آزمایش و اشکال‌زدایی را آسان‌تر می‌سازد
  • امکان موازی‌سازی و ذخیره‌سازی ایمن را فراهم می‌کند

استراتژی‌هایی برای حفظ خلوص و عدم تغییر:

  • استفاده از const برای متغیرهایی که نباید تغییر کنند
  • ایجاد اشیاء/آرایه‌های جدید به جای تغییر اشیاء موجود
  • استفاده از کتابخانه‌هایی مانند Immutable.js برای ساختارهای داده غیرقابل تغییر کارآمد

مثالی از یک تابع خالص:

function addToCart(cart, item) {
  return [...cart, item];
}

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

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

با استفاده از بازگشت، حالت از طریق آرگومان‌های تابع مدیریت می‌شود و تغییر از طریق آرگومان‌ها از یک فراخوانی بازگشتی به بعدی مدل‌سازی می‌شود.

راه‌حل‌های زیبا. بازگشت اغلب منجر به راه‌حل‌های زیباتر و مختصرتر برای مشکلاتی می‌شود که شامل ساختارهای سلسله‌مراتبی یا تکراری هستند. مزایا شامل:

  • بیان طبیعی برخی الگوریتم‌ها (مانند پیمایش درخت)
  • اجتناب از حالت قابل تغییر که معمولاً با حلقه‌ها همراه است
  • پتانسیل بهینه‌سازی‌های کامپایلر (بهینه‌سازی فراخوانی دمی)

با این حال، باید از خطرات سرریز پشته در جاوااسکریپت آگاه باشید، که در بیشتر محیط‌ها بهینه‌سازی فراخوانی دمی را ندارد. تکنیک‌هایی برای کاهش این خطرات شامل:

  • ترامپولین: بسته‌بندی فراخوانی‌های بازگشتی در thunkها
  • سبک انتقال ادامه: مدیریت صریح پشته فراخوانی

مثالی از یک تابع بازگشتی برای صاف کردن یک آرایه تو در تو:

function flatten(arr) {
  return arr.reduce((flat, next) => 
    flat.concat(Array.isArray(next) ? flatten(next) : next), 
  []);
}

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

خطوط تبدیل باید خالص باشند—هیچ داده‌ای با عبور از آن آسیب نمی‌بیند.

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

  • خوانایی کد را با نشان دادن مراحل پردازش داده بهبود می‌بخشد
  • قابلیت نگهداری را با جداسازی نگرانی‌ها افزایش می‌دهد
  • موازی‌سازی و بهینه‌سازی را تسهیل می‌کند

تکنیک‌هایی برای ساخت خطوط تبدیل:

  • زنجیره‌سازی متد (به عنوان مثال، با lodash)
  • ترکیب توابع خالص
  • کتابخانه‌های تخصصی مانند RxJS برای جریان‌های داده ناهمزمان

مثالی از یک خط پردازش داده:

const processOrders = pipe(
  fetchOrders,
  filterValidOrders,
  calculateTotals,
  generateReport
);

این به وضوح مراحل پردازش سفارشات را بدون غرق شدن در جزئیات پیاده‌سازی نشان می‌دهد.

8. طراحی مبتنی بر میکسین رویکردی تابعی به ترکیب اشیاء ارائه می‌دهد

داده‌های ساده بهترین هستند. انواع داده‌های تخصصی باید، خوب، خاص باشند.

ترکیب انعطاف‌پذیر. میکسین‌ها راهی برای ترکیب رفتار اشیاء بدون تکیه بر وراثت کلاسیک فراهم می‌کنند. این رویکرد:

  • اجازه می‌دهد طراحی کد انعطاف‌پذیر و مدولارتر باشد
  • از مشکلات مربوط به سلسله‌مراتب وراثتی عمیق جلوگیری می‌کند
  • سبک برنامه‌نویسی شیءگرا را به سمت تابعی‌تر تسهیل می‌کند

پیاده‌سازی میکسین‌ها در جاوااسکریپت:

  • استفاده از Object.assign() برای کپی کردن متدها به پروتوتایپ‌های اشیاء
  • به کارگیری توابع مرتبه بالاتر برای ایجاد توابع کارخانه‌ای که میکسین‌ها را اعمال می‌کنند

مثالی از ایجاد یک شیء با میکسین‌ها:

const withLogging = (obj) => ({
  ...obj,
  log: (msg) => console.log(`[${obj.name}]: ${msg}`)
});

const withValidator = (obj) => ({
  ...obj,
  validate: () => { /* validation logic */ }
});

const createUser = (name) => 
  withValidator(withLogging({ name, data: {} }));

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

آخرین به‌روزرسانی::

FAQ

What's Functional JavaScript about?

  • Focus on Functional Programming: Functional JavaScript by Michael Fogus introduces readers to functional programming concepts using JavaScript, with a particular emphasis on the Underscore.js library.
  • Core Principles: The book highlights the importance of treating functions as first-class citizens, which allows for more modular and maintainable code.
  • Practical Applications: It covers techniques like higher-order functions, recursion, and function composition, making it useful for both novice and experienced developers.

Why should I read Functional JavaScript?

  • Enhance JavaScript Skills: The book deepens your understanding of JavaScript by exploring functional programming paradigms, leading to cleaner and more efficient code.
  • Real-World Examples: It includes numerous examples and exercises that demonstrate how to apply functional programming concepts in everyday coding scenarios.
  • Broaden Programming Paradigms: By reading this book, you can expand your programming toolkit, making you a more versatile developer capable of tackling complex problems.

What are the key takeaways of Functional JavaScript?

  • First-Class Functions: Functions in JavaScript can be treated like any other value, allowing for powerful programming techniques.
  • Higher-Order Functions: Creating and using higher-order functions is crucial, as they enable functions to accept other functions as arguments or return them.
  • Recursion and Closures: The book covers recursion for problem-solving and closures for maintaining state in a functional programming context.

What is a higher-order function in Functional JavaScript?

  • Definition: A higher-order function is one that takes one or more functions as arguments or returns a function as its result.
  • Examples in the Book: Functions like _.map, _.filter, and _.reduce are highlighted as higher-order functions that operate on collections and accept callback functions.
  • Importance: Higher-order functions allow for more abstract and reusable code, enabling developers to create more flexible and modular applications.

How does Functional JavaScript explain recursion?

  • Recursive Definition: Recursion is defined as a function that calls itself to solve smaller instances of the same problem, such as calculating the length of an array.
  • Example Implementation: An example provided is the myLength function, which uses recursion to determine the length of an array by checking if it is empty and adding one for each element.
  • Benefits of Recursion: Recursion can simplify complex problems by breaking them down into smaller, more manageable parts, making code easier to read and maintain.

What are closures, as described in Functional JavaScript?

  • Definition of Closures: A closure is a function that captures the lexical scope in which it was defined, allowing it to access variables from that scope even after the outer function has finished executing.
  • Practical Use: The book illustrates closures with examples like makeAdder, which creates functions that remember their captured variables, enabling stateful behavior.
  • Significance: Understanding closures is essential for mastering JavaScript, as they are a fundamental concept that allows for data encapsulation and function factories.

How does Functional JavaScript define currying?

  • Definition of Currying: Currying is the process of transforming a function that takes multiple arguments into a sequence of functions that each take a single argument.
  • Example in the Book: The book provides an example of a curried function that allows for partial application of arguments, making it easier to create specialized functions.
  • Benefits of Currying: Currying enhances code reusability and flexibility, allowing developers to create more modular and composable functions.

What is the role of Underscore.js in Functional JavaScript?

  • Utility Library: Underscore.js is used throughout the book as a utility library that provides functional programming support in JavaScript, offering functions like map, reduce, and filter.
  • Facilitates Learning: The library simplifies the implementation of functional programming concepts, allowing readers to focus on understanding the principles rather than getting bogged down in low-level details.
  • Integration with JavaScript: The book demonstrates how to leverage Underscore.js to write cleaner, more functional JavaScript code, making it a practical resource for developers.

How does Functional JavaScript address immutability?

  • Importance of Immutability: The book stresses that immutability is a key principle in functional programming. By avoiding mutable state, developers can create more predictable and maintainable code.
  • Techniques for Immutability: Fogus discusses various techniques for achieving immutability in JavaScript, such as using Object.freeze and creating deep clones of objects.
  • Immutability in Practice: The author provides examples of how to implement immutability in real-world applications, demonstrating its benefits in terms of code clarity and reliability.

What are some best practices from Functional JavaScript?

  • Avoid Side Effects: The book emphasizes writing pure functions that do not modify external state, which leads to more predictable and testable code.
  • Use Higher-Order Functions: Leveraging higher-order functions can help create more abstract and reusable code, making it easier to manage complexity.
  • Embrace Recursion and Closures: Understanding and effectively using recursion and closures can enhance your ability to write functional JavaScript, allowing for elegant solutions to complex problems.

What are some practical examples from Functional JavaScript?

  • Building a Simple Validator: The book includes a section on creating a simple validation function that checks input values, illustrating how to apply functional programming principles to real-world scenarios.
  • Using Higher-Order Functions: Fogus provides examples of higher-order functions, such as map and filter, showing how they can be used to manipulate data collections effectively.
  • Creating a Lazy Chain: The author demonstrates how to implement a lazy chain of function calls, allowing for deferred execution of operations, showcasing the flexibility and power of functional programming techniques.

What are the best quotes from Functional JavaScript and what do they mean?

  • "Functional programming is the use of functions that transform values into units of abstraction, subsequently used to build software systems.": This quote encapsulates the essence of functional programming as described in the book.
  • "Purity is the key to predictability.": This emphasizes the importance of writing pure functions in functional programming, leading to more predictable behavior.
  • "Composition is the essence of functional programming.": This underscores the significance of function composition, a fundamental technique that enhances code reusability and clarity.

نقد و بررسی

4.07 از 5
میانگین از 100+ امتیازات از Goodreads و Amazon.

کتاب جاوااسکریپت تابعی عمدتاً نقدهای مثبتی دریافت کرده است و میانگین امتیاز 4.07 از 5 را کسب کرده است. خوانندگان از توضیحات واضح آن درباره‌ی مفاهیم برنامه‌نویسی تابعی در جاوااسکریپت قدردانی می‌کنند و رویکرد مستقیم و مثال‌های عملی آن را تحسین می‌کنند. بسیاری آن را چشم‌گشا و ارزشمند برای بهبود مهارت‌های کدنویسی خود می‌دانند. برخی از منتقدان به تراکم مطالب اشاره کرده و آن را برای برنامه‌نویسان متوسط تا پیشرفته توصیه می‌کنند. در حالی که عده‌ای به وابستگی آن به Underscore.js انتقاد کرده و کاربرد آن در دنیای واقعی را زیر سوال می‌برند، اکثر افراد توافق دارند که این کتاب مقدمه‌ای محکم برای تکنیک‌های برنامه‌نویسی تابعی در جاوااسکریپت ارائه می‌دهد.

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

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

0:00
-0:00
1x
Dan
Andrew
Michelle
Lauren
Select Speed
1.0×
+
200 words per minute
Home
Library
Get App
Create a free account to unlock:
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Recommendations: Get personalized suggestions
Ratings: Rate books & see your ratings
Try Full Access for 7 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
All summaries are free to read in 40 languages
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 10
📜 Unlimited History
Free users are limited to 10
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Apr 26,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
100,000+ readers
"...I can 10x the number of books I can read..."
"...exceptionally accurate, engaging, and beautifully presented..."
"...better than any amazon review when I'm making a book-buying decision..."
Save 62%
Yearly
$119.88 $44.99/year
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.
Scanner
Find a barcode to scan

Settings
General
Widget
Appearance
Loading...
Black Friday Sale 🎉
$20 off Lifetime Access
$79.99 $59.99
Upgrade Now →