বাবেল কেন আমদানি করা ফাংশন পুনরায় লেখবে (0, এফএন) (…)?


102

এর মতো একটি ইনপুট ফাইল দেওয়া হয়েছে

import { a } from 'b';

function x () {
  a()
}

বাবেল এটি সংকলন করবে

'use strict';

var _b = require('b');

function x() {
  (0, _b.a)();
}

লুজ মোডে কম্পাইল করার পরে ফাংশন কলটি আউটপুট হিসাবে হয় _b.a();

কমা অপারেটরটি কোথায় যুক্ত করা হয়েছে সে সম্পর্কে আমি এখানে কিছু গবেষণা করেছি, আশা করি সেখানে এখানে একটি মন্তব্য রয়েছে। এটি যুক্ত করার জন্য দায়ী কোডটি এখানে


4
_b.a.call()উদ্দেশ্যটি পরিষ্কার করার জন্য তাদের করা উচিত ছিল ।
বার্গি

@ বার্গি আমি নিশ্চিত যে তারা (0,) এর সাথে কারণটি স্থানান্তরিত কোডে স্থান সংরক্ষণ করবে।
অ্যান্ডি


উত্তর:


141

(0, _b.a)()নিশ্চিত ফাংশন যা _b.aদিয়ে বলা হয় thisবিশ্বব্যাপী বস্তুর সেট (অথবা কঠোর মোডে, এর যদি সক্ষম করা হয় undefined)। আপনি যদি _b.a()সরাসরি কল করতে চান তবে সেট _b.aআপ করে ডাকা thisহবে_b

(0, _b.a)(); সমতুল্য

0; // Ignore result
var tmp = _b.a;
tmp();

(এটি ,কমা অপারেটর, https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / অপারেটর / কমমা_অপ্রেটার দেখুন )।


4
লিঙ্কের জন্য ধন্যবাদ। এটিকে বহুবার অতিক্রম করে শেষ পর্যন্ত কী ঘটছে তা খুঁজে বের করার সিদ্ধান্ত নিয়েছে।
ফ্লাওয়ারসফটাইম

@ রবডাব্লু আমি var _a = (0, _b.a)ফাইলের শীর্ষে যোগ করার কথা ভাবব এবং তারপরে কল করার _aফলে অনেক ক্ষেত্রে আরও বেশি জায়গা বাঁচবে, কোন ধারণা তারা তা করেননি?
অ্যান্ডি

4
@ অ্যান্ডি আপনার পরামর্শের পার্শ্ব প্রতিক্রিয়া থাকতে পারে, উদাহরণস্বরূপ যখন _b.aকোনও (গতিশীল) প্রাপ্ত হয়।
রব ডব্লু

@ রবডব্লু আমি দেখছি, সুতরাং আপনি ধারণাটি হিসাবে বলছেন হ'ল ফাংশনটি ডাকা না হওয়া পর্যন্ত সম্ভাব্য পার্শ্ব প্রতিক্রিয়াগুলি এড়ানো।
অ্যান্ডি

লক্ষ্য করুন যে মডিউলগুলি সর্বদা কঠোর কোড, তাই এটি সর্বদা this === undefinedএবং আপনার গ্লোবাল অবজেক্টেরও উল্লেখ করার প্রয়োজন নেই
বার্গি

24

কমা অপারেটর এর প্রতিটি অপারেশনকে (বাম থেকে ডানে) মূল্যায়ন করে এবং শেষ অপারেন্ডের মান প্রদান করে।

console.log((1, 2)); // Returns 2 in console
console.log((a = b = 3, c = 4)); // Returns 4 in console

সুতরাং, একটি উদাহরণ দেখা যাক:

var a = {
  foo: function() {
    console.log(this === window);
  }
};

a.foo(); // Returns 'false' in console
(0, a.foo)(); // Returns 'true' in console

এখন, fooপদ্ধতিতে, thisসমান a(কারণ fooএটি সংযুক্ত a)। সুতরাং আপনি যদি a.foo(সরাসরি কল করেন ), এটি falseকনসোলে লগ ইন করবে ।

কিন্তু, আপনি যদি ফোন করা হয় (0, a.foo)()। অভিব্যক্তিটি এর (0, a.foo)প্রতিটি অপারেশনকে (বাম থেকে ডানে) মূল্যায়ন করবে এবং শেষ অপারেন্ডের মান প্রদান করবে। অন্য কথায়, (0, a.foo)সমান

function() {
  console.log(this === window);
}

যেহেতু এই ফাংশনটি আর কোনও কিছুর সাথে সংযুক্ত নেই, thisতাই এটি বিশ্বব্যাপী অবজেক্ট windowtrueকল করার সময় এটি কনসোলে লগইন করে (0, a.foo)()


console.log(this === window);ডেভ কনসোলে চলছে আর লগ প্রিন্ট করে না।
কুশদিলিপ

4
এটি আমার মন ফুঁকছিল। এখানে মূল কথাটি হ'ল কমা অপারেটরটি "শেষ অপরেন্ডের মানটি ফিরিয়ে দেয়" - এখানে "মান" হ'ল ফাংশনটি নিজেই এতে উপস্থিত পিতামাতাকে অনুপস্থিত - সুতরাং foo আর এর ভিতরে থাকে না।
martinp999
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.