আমার জাভাস্ক্রিপ্ট ফাংশন নাম কেন সংঘর্ষ হয়?


97

আমি ভেরিয়েবল এবং একটি ফাংশন যা তার কাছে নির্ধারিত ফাংশনগুলির সাথে তাদের নামগুলির সংঘর্ষ হয় তা হলে কী ঘটে তা দেখার জন্য আমি নিম্নলিখিত স্ক্রিপ্টটি লিখেছিলাম:

var f = function() {
    console.log("Me original.");
}

function f() {
    console.log("Me duplicate.");
}

f();

আমি যে আউটপুট পাচ্ছি তা হ'ল "আমি আসল"। অন্য ফাংশনটি কেন বলা হয়নি?

এছাড়াও, আমি যদি আমার আসল অ্যাসাইনমেন্টটি এতে পরিবর্তন করি তবে আমি var f = new function() {"মি অরিজিনাল" পাই, তারপরে টাইপএরর বলা হবে object is not a function। কেউ দয়া করে ব্যাখ্যা করতে পারেন?


26
@ ডিন.ডিপিউ - জাভাস্ক্রিপ্টের অংশ নিয়ে কোনও বিভ্রান্তি নেই। এগুলি পরিচালনা করার নিয়মগুলি বেশ স্পষ্ট (এবং তার উত্তরে বেনজামিন ব্যাখ্যা করেছেন)।
কুইন্টিন

4
কৌতূহল, এখনও কোনও ভাষা সম্পর্কে শেখার সেরা উপায়। :-D
সার্বারবাস

4
এছাড়াও, আমি কল্পনা করেছি যে "জাভাস্ক্রিপ্ট" এর মতো অবাস্তব কোনও
কিছুর

4
দ্বিতীয় উদাহরণে কেন আদেশ উত্তোলন করা উচিত?
সার্বারবাস

5
জাভাস্ক্রিপ্টের জ্ঞান বৃদ্ধির জন্য পদক্ষেপগুলি: ১) 'কড়া ব্যবহার করুন' 2) সর্বদা jslint বা jshint ব্যবহার করুন 3) jslint বা jshint যে বিষয়ে অভিযোগ করে সেগুলি দেখুন 4) ধুয়ে ফেলুন এবং পুনরাবৃত্তি করুন
স্টিভ-এর-রিনো

উত্তর:


170

জাভাস্ক্রিপ্টে ফাংশন ঘোষণাগুলি উত্তোলন করা হয় (শীর্ষে সরানো হয়েছে)। পার্সিং অর্ডারের ক্ষেত্রে ভুল থাকা অবস্থায়, আপনার কাছে কোডটি শব্দগুচ্ছভাবে নীচের মতই রয়েছে কারণ ফাংশন ডিক্লেয়ারেশনগুলি উত্তোলন করা হয়:

function f() {
    console.log("Me duplicate.");
}
var f = function() {
    console.log("Me original.");
}


f();

যা পরিবর্তে ফাংশনটির নাম বাদে একই রকম:

var f = function() {
    console.log("Me duplicate.");
}
var f = function() {
    console.log("Me original.");
}


f();

পরিবর্তনশীল উত্তোলনের কারণে পরিবর্তিত যা একই:

var f;
f = function() {
    console.log("Me duplicate.");
}
f = function() {
    console.log("Me original.");
}

f();

যা আপনি কী পাচ্ছেন তা ব্যাখ্যা করে, আপনি ফাংশনটি ওভাররাইড করছেন। আরও সাধারণভাবে, varজাভাস্ক্রিপ্টে একাধিক ঘোষণার অনুমতি রয়েছে - var x = 3; var x = 5পুরোপুরি আইনী। নতুন ECMAScript 6 স্ট্যান্ডার্ডে letবিবৃতি এটিকে নিষিদ্ধ করে।

@ কংগ্যাক্সের এই নিবন্ধটি জাভাস্ক্রিপ্টে ডিমেস্টাইটিং ফাংশনগুলিতে দুর্দান্ত কাজ করেছে does


4
আপনি কি সত্যিই এত সহজ function f()করতে পারেন var f = function()? উত্তোলন এবং ফাংশন নামগুলি কি আসলেই একমাত্র তফাত?
djechlin

6
এই প্রশ্নটির প্রসঙ্গে @ ডিজেচলিন - হ্যাঁ। সাধারণত, এটি আরও সূক্ষ্ম - stackoverflow.com/questions/336859/… দেখুন । সংকলক দৃষ্টিকোণ থেকে, তারা পৃথক - কিন্তু প্রোগ্রামার দৃষ্টিকোণ থেকে - আমরা দাবি করতে যথেষ্ট এটি কাছাকাছি । এই কারণেই আমি সেই দীর্ঘটি যুক্ত করেছি "পার্সিং অর্ডারের ক্ষেত্রে ভুল থাকা অবস্থায়, আপনার কোডটি শব্দগুচ্ছভাবে" বলার পরিবর্তে "হিসাবে একই" হিসাবে একই। ভাল যুক্তি.
বেনিয়ামিন গ্রুইনবাউম

4
@ ডটস্ল্যাশ দয়া করে আপনার মূল প্রশ্নটি সম্পাদনা করবেন না এবং এটিকে পরিবর্তন করবেন না, এটি এখানে খারাপ আচরণ হিসাবে বিবেচিত হয় - এছাড়াও, বেশ কয়েকটি প্রশ্নের মিশ্রণকেও এখানে খারাপ আচরণ বলে বিবেচিত হয়। পরিবর্তে আপনি একটি নতুন প্রশ্ন জিজ্ঞাসা করতে পারেন বা, যদি আপনি এটি খুব সামান্য বলে মনে করেন তবে মন্তব্যে স্পষ্টতা জিজ্ঞাসা করুন (এটি সে যাই হোক না কেন)। উপরের কোডে, উভয় সংস্করণ fউত্তোলন করা হবে, এবং "Me Original"সংস্করণটি কেবল পরে উত্তোলিত হবে , সেগুলি প্রতিটি শীর্ষে চলে গেছে তবে একই ক্রমে। আমি কেবল এটি যুক্ত করতে চাই, আপনার বেশ কয়েকটি ফাংশনটির নাম একইভাবে রাখবেন না :)
বেনজামিন গ্রুইনবাউম

5
কড়া মোডে আপনি varএকই স্কোসে দু'বার একই নামটি করতে পারবেন না ।
হফম্যান

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

10

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

আপনি জিজ্ঞাসা করেছেন কেন এটি:

var f = new function() {
    console.log("Me original.");
}

function f() {
    console.log("Me duplicate.");
}

f();

"মি অরিজিনাল" প্রিন্ট করে। এবং তারপরে একটি ত্রুটি।

এখানে যা ঘটছে তা হ'ল newফাংশনটি কনস্ট্রাক্টর হিসাবে ব্যবহার করার কারণ। সুতরাং এটি নিম্নলিখিত সমতুল্য:

function myConstructor() {
    console.log("Me original.");
}
var f = new myConstructor();

function f() {
    console.log("Me duplicate.");
}

f();

এবং বেনিয়ামিন যে অনুষ্ঠান উত্তোলনের ব্যাখ্যা দিয়েছিলেন তার জন্য ধন্যবাদ, উপরোক্তগুলি মূলত এর সমতুল্য:

var myConstructor = function() {
    console.log("Me original.");
};
var f = function() {
    console.log("Me duplicate.");
};

f = new myConstructor();

f();

এই অভিব্যক্তি:

var f = new function() {
    console.log("Me original.");
}

কনস্ট্রাক্টর fহিসাবে একটি বেনামি ফাংশন ব্যবহার করে একটি নতুন অবজেক্ট তৈরি এবং নির্ধারিত করে causes "আমি আসল।" কনস্ট্রাক্টর এক্সিকিউট হিসাবে মুদ্রিত হয়। তবে যে অবজেক্টটি নির্মিত হয় তা নিজেই কোনও ফাংশন নয়, সুতরাং যখন এটি শেষ পর্যন্ত সম্পাদন করে:

f();

আপনি একটি ত্রুটি পান, কারণ fএটি কোনও ফাংশন নয়।


ওহ, দুর্দান্ত! সমস্যার উত্তর দেওয়ার জন্য অনেক ধন্যবাদ! :) :)
ankush981

2

ক্ষমা করুন যদি এটি কোনও পয়েন্ট যুক্ত করার পদ্ধতির ভুল উপায় হয়। আমি এখানে খুব বেশি কিছু পাইনি, এবং গঠনমূলক দিকনির্দেশ এবং / বা সমালোচনাকে স্বাগত জানাব।

বেঞ্জামিনের উত্তরটি ওপির প্রশ্নটিকে দুর্দান্তভাবে সম্বোধন করেছে, তবে আমি একটি টুইট করতে চাই যা আমাদের উত্তোলন এবং এর বৈচিত্র্যগুলির একটি সম্পূর্ণ সফর দেবে।

যদি আমরা কলটি দিয়ে মূল কোডটি শুরু করি f, তবে:

f();

var f = function() {
   console.log("Me original.");
};

function f() {
   console.log("Me duplicate.");
}

f();

আউটপুটটি তখন হবে:

Me duplicate.
Me original.

কারণ varএবং functionবিবৃতিগুলি কিছুটা ভিন্ন উপায়ে উত্তোলন করা হয়।

জন্য ঘোষণা বর্তমান সুযোগ * উপরের চলে যায়, কিন্তু কোনো কাজ উত্তোলন করা হয় না। ঘোষিত ভেরার মান যতদূর যায়, মূল অ্যাসাইনমেন্ট লাইনটি না পৌঁছানো পর্যন্ত এটি অপরিজ্ঞাত।var

জন্য functionবিবৃতি , উভয় ঘোষণা এবং সংজ্ঞা উত্তোলন করা হয়। কনস্ট্রাক্ট হিসাবে ব্যবহৃত ফাংশন এক্সপ্রেশন , var f = function() {...উত্তোলন করা হয় না।

উত্তোলনের পরে, মৃত্যুদন্ড কার্যকর করার মতো কোডটি ছিল:

var f; // declares var f, but does not assign it.

// name and define function f, shadowing the variable
function f() { 
  console.log("Me duplicate.");
}

// call the currently defined function f
f(); 

// assigns the result of a function expression to the var f,
// which shadows the hoisted function definition once past this point lexically
f = function() { 
  console.log("Me original."); 
}

// calls the function referenced by the var f
f();

* সমস্ত জাভাস্ক্রিপ্ট স্কোপ লেক্সিকাল, বা ফাংশন, স্কোপ, তবে দেখে মনে হয়েছিল এটি কেবলমাত্র শব্দটিকে ব্যবহার করতে বিভ্রান্ত করবে point

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