سؤال

لماذا لا ينتج هذا أي شيء؟

console.log(JSON.stringify(function(){console.log('foobar');}));
هل كانت مفيدة؟

المحلول

لا يمكن لـ JSON تقييد الوظائف على الإطلاق، بل يتعامل معها تمامًا undefined أو null قيم.يمكنك التحقق من الخوارزمية الدقيقة على إيكماسكريبت 5.1 §15.12.3, ، انظر أيضًا الوصف في MDN.

ومع ذلك، يمكنك بالطبع تقييد التعبير الوظيفي عن طريق تحويله إلى سلسلة، حاول

console.log("" + function(){console.log('foobar');})

نصائح أخرى

json ليس لديه وسيلة لتمثيل وظيفة.إنه تنسيق بيانات مصمم للبساطة والتوافق عبر اللغات (ووظيفة هو آخر شيء سيكون متوافقا مع لغة).

من مستندات json.stringify :

إذا تم تواجه غير محدد أو وظيفة أو قيمة XML أثناء التحويل يتم حذفها (عندما يتم العثور عليها في كائن) أو رقابة على NULL (عند العثور عليها في صفيف).

لا يمكنك فعل ذلك، ولكن هناك بعض مكتبات الطرف الثالث يمكن أن تساعدك في القيام بذلك، مثل: https://www.npmjs.com/package/json-fn

إذا كنت تريد استخدام JSON.stringify لتحويل الوظائف والكائنات الأصلية أيضًا، يمكنك تمرير دالة المحول كوسيطة ثانية:

const data = {
  fn: function(){}
}

function converter(key, val) {
  if (val && typeof val === 'function' || val.constructor === RegExp) {
    return String(val)
  }
  return val
}

console.log(JSON.stringify(data, converter, 2))

يعود undefined من وظيفة المحول إذا كنت تريد حذف النتيجة.

المعلمة الثالثة هي عدد المسافات التي تريد أن يقوم الإخراج بوضع مسافة بادئة لها (اختياري).

yourFunctionName.toString(); سوف يقوم أيضًا بتقييد الوظيفة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top