জাভাস্ক্রিপ্টে, আমি যদি প্রথম বন্ধনীর সাথে কোনও ফাংশন কল করি তবে কী তার পার্থক্য রয়েছে?


105

খালি বন্ধনীর সাথে কোনও ফাংশন কল করার সময় বা কোনও প্যারেন্টেসিস ছাড়াই আমি একটি ত্রুটি লক্ষ্য করেছি। যাইহোক, আমি ফাংশনে কোনও যুক্তি দিচ্ছি না তাই আমি ভাবলাম, এর মধ্যে পার্থক্য কী হবে:

window.onload = initAll();

এবং

window.onload = initAll;

এর পিছনে নীতিটি ব্যাখ্যা করুন।


24
@ জেএস ব্যাঙ্গস - কেবল মার্কিন ইংরেজিতে; অন্য কোথাও নয় যদিও প্রোগ্রামাররা তাদের বিভ্রান্তি এড়াতে তাদের "বন্ধনী" নামে অভিহিত করে, ইউকে ইংরাজীতে বৃত্তাকারগুলি কেবল বন্ধনী হিসাবে পরিচিত known বর্গাকারগুলি "বর্গাকার বন্ধনী" হিসাবে পরিচিত। en.wikedia.org/wiki/Braket
রব লেভাইন

13
একটি গুরুতর নোটে, সরকারী ইউনিকোডের নাম প্যারেন্টেসিস। 0028 ( লেফট প্যারেন্থেসিস = খোলার প্রথম বন্ধনী (1.0) এবং 0029 ) রাইট প্যারেন্টেসিস = সমাপনী প্রথম বন্ধনী (1.0) - ইউনিকোড.আর / চার্টস / চ্যারিনডেক্স.চ.টি.এম.এল.পি এবং অভিধান.কম এর বিষয়ে কী বলবে - অভিধান. references.com/ ব্রাউজ / প্যারেন্থেসিস "হয় বা উভয় খাড়া বাঁকা লাইন, () ..."

8
সুতরাং এটি কেবল একটি "ইউএস ইংলিশ" জিনিস নয়, এটি একটি আন্তর্জাতিক মানের সংজ্ঞা কারণ ইউনিকোড একটি আন্তর্জাতিক মান Standard

2
@ ফাজি - আপনি আপনার সত্যগুলি কোথা থেকে পেয়েছেন, গুরুত্ব সহকারে? {}বলা হয় কাঠবিড়ালি বন্ধনী।
অনুরাগ

7
@ ফাজি ললিপপ - ইউনিকোড নামকরণ নয়, বাইট হিসাবে অক্ষরগুলি এনকোডিংয়ের একটি আন্তর্জাতিক মান। ইউনিকোড নথির লেখকরা কোনও চরিত্রের জন্য প্রদত্ত নামটি আন্তর্জাতিক মানের দাবি করছেন না। কোডটি বনাম, চরিত্রটি তারা সংজ্ঞায়িত করছে। তবে আপনি লক্ষ করতে পারেন যে এগুলি [এবং] বর্গাকার বন্ধনী হিসাবেও উল্লেখ করে - (কেবল "বন্ধনী" নয়) এবং তারা সমস্ত [, {এবং (বন্ধনী অক্ষর হিসাবে উল্লেখ করে) আপনাকে সূক্ষ্মতা বোঝার চেষ্টা করা উচিত বিভিন্ন জায়গাগুলি যেভাবে একই শব্দ ব্যবহার করে .যদি আপনি কোনও আন্তর্জাতিক দলের অংশ হন তবে খুব গুরুত্বপূর্ণ
রব লেভাইন

উত্তর:


161
window.onload = initAll();

এই , executes initAll() সোজা দূরে এবং নির্ধারণ ফাংশনের ফেরানো মানটি করতে window.onload। এটি সাধারণত যা চান তা নয়initAll()এই বোঝার জন্য একটি ফাংশন ফিরে আসতে হবে।

window.onload = initAll;

এই নির্ধারণ প্রকৃত ফাংশন থেকে window.onload- এই সম্ভব কারণ জাভাস্ক্রিপ্ট মধ্যে, @Felix বলেছেন, ফাংশন প্রথম শ্রেণীর বস্তু - এটা নির্বাহ ছাড়া। initAllলোড ইভেন্ট দ্বারা কার্যকর করা হবে।


18
এখানে উল্লেখ করা গুরুত্বপূর্ণ যে ফাংশনগুলি জাভাস্ক্রিপ্টে প্রথম শ্রেণীর অবজেক্ট।
ফেলিক্স ক্লিং

136

পেক্কা যা বলেছেন তা সঠিক, তবে আমি একটি উদাহরণ দিয়ে আরও কিছুটা ব্যাখ্যা করতে চাই যা ফাংশন পয়েন্টার বা প্রতিনিধিদের পুরোপুরি বুঝতে না পারে এমন কাউকে ব্যাখ্যা করতে সহায়তা করবে।

আমি ব্যবহার করব না window.onloadকারণ এটি প্রদর্শনের জন্য কিছুটা সংঘাতবদ্ধ। পরিবর্তে ডেমোতে আমি একটি সাধারণ গুণিত ফাংশন ব্যবহার করব:

function Multiply(operator, operand) {
    return operator * operand;
}

এটি সমানভাবে লেখা যেতে পারে:

Multiply = function(operator, operand) {
    return operator * operand;
}

প্রথম উদাহরণে, বোঝাটি স্পষ্ট নাও হতে পারে, দ্বিতীয় উদাহরণটি আরও স্পষ্টভাবে দেখায় যে আমরা একটি ফাংশন বরাদ্দ করছি যার নামক একটি ভেরিয়েবলের 2 পরামিতি রয়েছে Multiply, এবং কার্যাদি হিসাবে এই ধারণাটি জাভাস্ক্রিপ্ট জুড়ে সাধারণ। এটি ফাংশনগুলি "প্রথম শ্রেণির নাগরিক" হ'ল এটির একটি ছোট্ট প্রদর্শনী , এটি হ'ল আমাদের মূল্যবোধের পাশ দিয়ে চলেছে এমনভাবে হ'ল।

সুতরাং এখন নিয়োগের পার্থক্য:

var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);

রেট ভেরিয়েবল সংজ্ঞায়নের পয়েন্টে Multiplyএক্সিকিউট করা হয় এবং রিটার্নের মান নির্ধারিত হয় - ret12 এর সমান হয়।

এর আবার চেষ্টা করুন অন্যভাবে:

var operator = 3;
var operand = 4;
var ret = Multiply;

এখন, সংজ্ঞা দেওয়ার মুহুর্তে ret, retআপনার Multiplyফাংশন থেকে প্রাপ্ত ফলাফল হওয়ার বিপরীতে আপনার ফাংশন হয়ে যায় Multiply। কলগুলি ret()আপনার Multiplyক্রিয়াকলাপ কার্যকর করার কারণ ঘটায় এবং আপনি একে কল করতে ঠিক যেমন কল করতে পারেন Multiply(operator, operand):

var out = ret(3, 4);

হিসাবে একই

var out = Multiply(3, 4);

আপনি কার্যকরভাবে বলেছেন যে আপনি retএকটি প্রতিনিধি হিসাবে ব্যবহার করতে যাচ্ছেন Multiply()। কল করার সময় ret, আমরা সত্যিই Multiplyফাংশনটি উল্লেখ করছি ।

আপনার ফিরে window.onload। এটিকে এভাবে ভাবুন:

window.onload = function() {
    //Doing what all good window.onload functions should do...
}

initAll = function() {
    return 12;
}

আপনি যেমন দেখতে পাচ্ছেন, window.onloadঅন্য ফাংশনের মতোই এটিও একটি ফাংশন, এটি সম্পর্কে বিশেষ কিছু নেই। আপনি এটিকে একটি মূল্য নির্ধারণ করতে পারেন, এটি একটি ফাংশন বরাদ্দ করতে পারেন, আপনি ইচ্ছা করলে তা বাতিল করুন - মূল বিষয়টি হ'ল window.onloadআপনার নিজস্ব ফাংশন সম্পর্কে যা আছে তার চেয়ে বিশেষ বিশেষ কিছুই নেই । কেবল সামান্য ভিন্ন জিনিসটি এটি লোড হওয়ার পরে উইন্ডো দ্বারা ডাকা হয়। [অস্বীকৃতি: আমি উইন্ডো ফাংশনগুলিকে আসলে কখনই ছাড়িনি, সুতরাং আমি নিশ্চিত নই যে এটি নেতিবাচক প্রতিরোধ ঘটাবে কিনা I'm কেউ আশা করবে তারা এটি পরীক্ষা করার আগে কোনও ফাংশন নির্ধারিত হয়েছে কিনা তা পরীক্ষা করে দেখুন if (window.onload) window.onload();]।

এখন initAll()আমরা যা বলছি তা কল করা হচ্ছে:

window.onload = initAll();

যা পাশাপাশি বলতে পারে:

window.onload = 12;

কিন্তু যখন আমরা বলি initAllপ্রথম বন্ধনী ছাড়া, আমরা কি সত্যিই বলছে: আমি প্রতিস্থাপন করতে যাই হোক না কেন আমার window.onload ফাংশন একটি নতুন ফাংশন হল চাই - অর্থাত আমি আমার সঙ্গে এটি প্রতিস্থাপন করতে চান initAllফাংশন, যাতে কোনো কল window.onloadরান আমার initAllকোড।

তাই:

window.onload = function() {
    //Doing what all good window.onload functions should do...
}

এর সাথে প্রতিস্থাপন করা হয়:

window.onload = function() {
    return 12;
}

সুতরাং যে কোনও window.onloadকলই মূলত initAllযা window.onloadছিল তার পরিবর্তে আপনার ফাংশনটি কার্যকর করবে । আপনি আপনার নতুন ফাংশন দিয়ে মূল ফাংশনটি প্রতিস্থাপন করেছেন।

আসলে, আপনি পারে সমানভাবে লিখুন:

window.onload = function() {
    //Write all your init code right in here instead of having a separate 
    //initAll function.
}

আরও একটি উদাহরণ যা আরও ভালভাবে প্রদর্শন করতে পারে তা হ'ল:

var d = new Date();
var currentTime = d.getTime();

সময়টি যা ছিল dতা নির্ধারিত শেষ পর্যন্ত নির্ধারিত currentTime। দুর্দান্ত, তবে এটি কেবলমাত্র তখনই কার্যকর যদি আমরা সেই কোডটি সম্বলিত ফাংশনটি কখন ডাকা হত - তা পৃষ্ঠা লোডের সময়টিতে জানতে চাই। আমরা যদি বর্তমান সময়ের যেকোন সময় currentTimeবলা চাই?

var currentTime = function() {
    var d = new Date();
    return d.getTime();
}

var a = currentTime(); //The current time at the point a is defined...
var b = currentTime;   //b is a functional reference to currentTime...
var c = b(); //The current time when variable c is defined
var d = c; //The current time when variable c was defined

লক্ষ্য করুন আমরা কীভাবে আমাদের কল b()করতে পারি cএবং dঅ্যাসাইনমেন্টগুলিতে আমরা কল করতে পারি ঠিক তেমনভাবে currentTime()?


দুর্দান্ত উত্তর!
শাদী আলমোসরি

আরে, যদি আমি কোনও অনুষ্ঠান যুক্ত করতে চাই যা কোনও ইভেন্ট শ্রোতার পক্ষে যুক্তি গ্রহণ করে?
শেমিরোথ

16

জাভাস্ক্রিপ্টে ফাংশনগুলি প্রথম শ্রেণির নাগরিক এবং এর মতো অন্যান্য ভেরিয়েবলগুলিতে বরাদ্দ করা যেতে পারে বা তর্ক হিসাবে চারপাশে পাস করা যায়।

সুতরাং, আপনি যখন করবেন

window.onload = initAll;

আপনি নিজেই ফাংশনটি রেফারেন্স করার জন্য সামগ্রীর onloadসম্পত্তি সেট করছেন settingwindowinitAll

যখন তুমি কর

window.onload = initAll();

আপনি onloadসম্পত্তিটি initAll এর রিটার্ন মান ধরে রাখতে সেট করছেন, যেহেতু এটি line লাইনের স্থানে কার্যকর হবে।


10

initAll এটি একটি ফাংশন মানের একটি রেফারেন্স এবং বন্ধনী অপারেটরটি এই ফাংশনটির অবজেক্টটি ফাংশন নামের সাথে যুক্ত করে।

সুতরাং যদি আপনি কিছু মত

a = initAll

তারপরে aএকই হয়ে যাবে initAll- উদাহরণস্বরূপ আপনি করতে পারেন a()- তবে সাথে

a = initAll()

ভেরিয়েবল aএক্সিকিউটেড initAllফাংশনের রিটার্ন মান পাবে


8

আমি 6 বছর দেরী হয়েছি তবে আমার মনে হয় উপরের উত্তরগুলির তুলনায় এটি আরও সহজ ব্যাখ্যা করা যেতে পারে।

সুতরাং এখানে টিএলডিআর ; বা বার্ডস আই ভিউ ব্যবহার করে যখন ফাংশন কলিং এবং ব্যবহার করছেন না ()'এর

উদাহরণস্বরূপ এই ফাংশনটি ধরুন:

function foo(){
return 123;
}

যদি আপনি "foo" লগ করেন - ছাড়াই ()

console.log(foo); 

---outout------
function foo(){
return 123;
}

ফাংশনটি নিজেই আনতে কোনও ()উপায় ব্যবহার করা হচ্ছে না । আপনি যদি এটি কলব্যাক হিসাবে পাস করতে চান তবে আপনি এটি করবেন।


যদি আপনি "foo ()" - এর সাথে লগ করেন ()

console.log(foo());
-----output-----
 123

()কোনও ফাংশনের পরে ব্যবহার করার অর্থ ফাংশনটি সম্পাদন করা এবং এর মানটি ফিরিয়ে দেওয়া

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.