আমি কফিস্ক্রিপ্টে কীভাবে বিশ্বব্যাপী পরিবর্তনগুলি সংজ্ঞায়িত করব?


317

Coffeescript.org এ:

bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10) 

সংকলন করতে হবে:

var bawbag;
bawbag = function(x, y) {
  var z;
  return (z = (x * y));
};
bawbag(5, 10);

নোড.জেএস এর অধীনে কফি-স্ক্রিপ্টের মাধ্যমে সংকলন যাতে মোড়ানো হয়:

(function() {
  var bawbag;
  bawbag = function(x, y) {
    var z;
    return (z = (x * y));
  };
  bawbag(5, 10);
}).call(this);

দস্তাবেজগুলি বলেছেন:

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

আমি কিভাবে কফি স্ক্রিপ্টে গ্লোবাল ভেরিয়েবলগুলি সংজ্ঞায়িত করব। 'উইন্ডোতে বৈশিষ্ট্য হিসাবে এগুলি সংযুক্ত করুন' এর অর্থ কী?


4
মনে রাখবেন যে গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করা খারাপ, c2.com/cgi/wiki?GlobalVariablesAreBad , এবং এমনকি ক্ষতিকারক হিসাবে বিবেচিত, c2.com/cgi/wiki?GotoConsideredHarmful । এগুলি জাভাস্ক্রিপ্টে মোটেও ব্যবহার করার কোনও কারণ নেই, কারণ ক্লোজারগুলির মতো দুর্দান্ত বৈশিষ্ট্য রয়েছে যা আপনি বিশ্বব্যাপী ভেরিয়েবলগুলি সমাধান করতে বেশিরভাগ সমস্যার সমাধান করতে পারেন।
ইভজিনি

9
@ এভজেনি আমি এখানে আপনার সাথে একমত হওয়ার পরেও কিছু ক্ষেত্রে এটি একটি কেন্দ্রীয় 'অ্যাপ' অবজেক্ট তৈরি করা এবং এটির সাথে মডিউল যুক্ত করা প্রয়োজন।
জ্যাকায়ালসাইন

1
কেন্দ্রীয় বস্তুগুলি windowবস্তু বা বস্তুর মতো বিদ্যমান বিশ্বব্যাপী রাষ্ট্রীয় অবজেক্টগুলিতে সংরক্ষণ করা যায় exports। গ্লোবাল ভেরিয়েবল তৈরি করার দরকার নেই।
ইভজেনি

9
@ এভজিনি গ্লোবাল ভেরিয়েবলগুলি window(বা globalনোডেজগুলিতে) অবজেক্টের বৈশিষ্ট্য হিসাবে সংরক্ষণ করা হয়েছে
শেসেক

21
হ্যাঁ, বৈশ্বিক বৈচিত্র্য দেওয়া ইন্সটা-খারাপ নয়। তাদের অ্যাপ্লিকেশনটি বিনা চিন্তা করে বন্ধ করার জন্য কেবল খারাপ অনুশীলন। এটিকে একটি ঘোষণা করা এবং এটি jQuery এর মতো অ্যাডাপ্টার কারখানা হিসাবে বা কোনও একরকম নেমস্পেস হিসাবে ব্যবহার করা সত্যই সাধারণ অনুশীলন।
এরিক রিপেন

উত্তর:


419

যেহেতু কফি স্ক্রিপ্টের কোনও varবিবৃতি নেই এটি কফি-স্ক্রিপ্টের সমস্ত ভেরিয়েবলের জন্য এটি স্বয়ংক্রিয়ভাবে সন্নিবেশ করায়, এইভাবে এটি সংকলিত জাভাস্ক্রিপ্ট সংস্করণটিকে বিশ্বব্যাপী নেমস্পেসে সবকিছু ফাঁস করা থেকে বাধা দেয় ।

সুতরাং যেহেতু কিছুতে "ফুটো" করার কোনও উপায় নেই উদ্দেশ্য অনুযায়ী জিনিসগুলির কফি-স্ক্রিপ্ট দিক থেকে গ্লোবাল নেমস্পেসে , তাই আপনাকে আপনার বিশ্বব্যাপী ভেরিয়েবলগুলি বিশ্বব্যাপী বস্তুর বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত করতে হবে ।

এগুলি উইন্ডোতে বৈশিষ্ট্য হিসাবে সংযুক্ত করুন

এর অর্থ আপনার মতো কিছু করা দরকার window.foo = 'baz'; যা ব্রাউজারের ক্ষেত্রে পরিচালনা করে, কারণ সেখানে বিশ্বব্যাপী অবজেক্ট হলwindow

node.js

নোড.জেএসগুলিতে কোনও windowবস্তু নেই, পরিবর্তে exportsনোড.জেএস মডিউলটি মোড়ানো মোড়কে এমন বস্তু প্রবেশ করবে যা দেখুন ( https://github.com/ry/node/blob/master/src/node.js# L321 ), সুতরাং আপনাকে যা করতে হবে তা হলexports.foo = 'baz';

এখন আসুন আমরা দস্তাবেজগুলি থেকে আপনার উদ্ধৃতিতে কী বলেছে তা একবার দেখে নেওয়া যাক:

... সাধারণ জেএস এবং ব্রাউজার উভয়কে লক্ষ্য করে: রুট = এক্সপোর্ট? এই

এটি স্পষ্টতই কফি-স্ক্রিপ্ট, সুতরাং আসুন এটি একবার কী সংকলিত হয় তা একবার দেখুন:

var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;

প্রথমে এটি যাচাই করবে কিনা exports নির্ধারণ করা হয়েছে , যেহেতু জাভাস্ক্রিপ্টে কোনও অস্তিত্বের পরিবর্তনশীল উল্লেখ করার চেষ্টা করলে অন্যথায় একটি সিনট্যাক্স এরর পাওয়া যায় (এটি যখন ব্যবহৃত হয় তখন বাদে)typeof )

সুতরাং যদি exportsউপস্থিত থাকে, যা নোড.জেএস (বা কোনও খারাপভাবে লিখিত ওয়েবসাইটটিতে ...) এর মূলটি নির্দেশ করবে exports, অন্যথায় this। তাহলে কি this?

(function() {...}).call(this);

.callকোনও ফাংশন ব্যবহার করে ফাংশনটির thisঅভ্যন্তরের সাথে প্রথম প্যারামিটারটি বেঁধে দেওয়া হবে, ব্রাউজারের ক্ষেত্রে thisএখন windowনোড.জেজেসের ক্ষেত্রে এটিই হবে বিশ্বব্যাপী প্রসঙ্গ যা globalঅবজেক্ট হিসাবে উপলব্ধ ।

তবে যেহেতু আপনার requireনোড.জেজে ফাংশন রয়েছে তাই নোড.জেজে globalবস্তুটির জন্য কিছু বরাদ্দ করার দরকার নেই , পরিবর্তে আপনিexports বস্তুকে যা requireফাংশনটি দিয়ে ফিরে আসে ।

কফি-স্ক্রিপ্ট

এই সমস্ত ব্যাখ্যা পরে, আপনার যা করা দরকার তা এখানে:

root = exports ? this
root.foo = -> 'Hello World'

এটি fooবিশ্বব্যাপী নেমস্পেসে আমাদের ফাংশনটি ঘোষণা করবে (যা কিছু ঘটুক না কেন)।
এখানেই শেষ :)


1
@IvoWetzel - মধ্যে পার্থক্য কি global, GLOBALএবং rootNode.js বস্তু?
অদিত এম শাহ

1
জাভাস্ক্রিপ্টে একটি অস্তিত্বের পরিবর্তনশীল উল্লেখ করার চেষ্টা করা অন্যথায় একটি সিনট্যাক্স এরিয়ার উপস্থাপন করবে আপনি কি বোঝাতে চাইছেন না ReferenceError?
অলেক্স

12
বা আরও ছোট:(exports ? this).foo = -> 'Hello World'
ডেন ও'কনোর

3
this.foo প্রায়শই হয়! = উইন্ডো.ফু যদিও আপনি 'এই' প্রসঙ্গটি ইতিমধ্যে একটি অবজেক্ট। এটি একটি বিভ্রান্তিকর সিনট্যাক্স।
কেভিন

1
আমি ব্যবহারের সাথে একমত global = exports ? this। "নোড.জেএস এর ক্ষেত্রে এটি বিশ্বব্যাপী প্রেক্ষাপট হবে ..." দাবিটি ভুল কারণ কারণ thisপরিবর্তনশীল, যখন নোড.জেএস দ্বারা চালিত হয় বা মডিউল স্কোপ হিসাবে মূল্যায়ন করা হয়। সুতরাং যদি আপনি আশা করেন যে এগুলিতে প্রপস সেট করা বিশ্বব্যাপী এটি অ্যাক্সেসযোগ্য হয়ে উঠবে, আপনি হতাশ হবেন। আপনি যদি নোড.জেএস এর প্রসঙ্গে বিশ্বব্যাপী জিনিসগুলি সেট করতে চান তবে আপনার globalপরিবর্তে চলকটি ব্যবহার করা দরকার this
কেএফএল

58

আমার কাছে মনে হয় @ অ্যাটমিকুলসের সহজ উত্তর রয়েছে তবে আমি মনে করি এটি আরও কিছুটা সহজ করা যায়। আপনি @বৈশ্বিক হতে চান এমন কোনও কিছুর আগে আপনাকে একটি আবশ্যক করা দরকার , যাতে এটি সংকলন করে this.anythingএবংthis বিশ্বব্যাপী অবজেক্টকে রেফার করে।

তাই ...

@bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10)

সংকলন ...

this.bawbag = function(x, y) {
  var z;
  return z = x * y;
};
bawbag(5, 10);

এবং node.js দ্বারা প্রদত্ত মোড়কের ভিতরে এবং বাইরে কাজ করে

(function() {
    this.bawbag = function(x, y) {
      var z;
      return z = x * y;
    };
    console.log(bawbag(5,13)) // works here
}).call(this);

console.log(bawbag(5,11)) // works here

7
আপনি ইতিমধ্যে অন্য সুযোগের ভিতরে থাকলে তবে এটি কাজ করবে না? কারণ এরপরে thisআর বৈশ্বিক অবজেক্টকে বোঝানো যায় না
শেরউইন ইউ

1
এটি সঠিক, সুতরাং আপনি আপনার পরিবর্তনশীলকে একটি উপযুক্ত সুযোগে সংজ্ঞায়িত করতে পারেন (এবং এটি অন্যদের মধ্যে ব্যবহার করুন), বা window.myVariableযে কোনও জায়গায় কাজ করবে তা নির্ধারণ করুন।
বিলি মুন

2
এই / গ্লোবাল নেমস্পেসের অধীনে ফাংশনটি তৈরি করার জন্য আপনাকে কোফিস্ক্রিপ্টকে নির্দেশ দেওয়ার =>পরিবর্তে আপনার আর একটি পরিবর্তনশীল সংজ্ঞা দেওয়ার দরকার নেই->
রিকার্ডো ভিলামিল

2
এটি এতটা সহায়ক ছিল, এখন আমি একটি পৃথক কফি স্ক্রিপ্টে বিশ্বব্যাপী অবজেক্ট এবং ফাংশন তৈরি করতে পারি
ডিয়েগো ফার্নান্দো মুরিলো ভ্যালেনসি

এটি অনেক ভাল।
জেএসকে সিএসে

33

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

যাইহোক, এখানে কেন এটি সাধারণত একটি খারাপ ধারণা: কফিস্ক্রিপ্ট সংকলক those ভেরিয়েবলগুলি সম্পর্কে অসচেতন, যার অর্থ তারা সাধারণ কফিস্ক্রিপ্ট স্কোপিং বিধি মানবে না। সুতরাং,

`foo = 'bar'`
foo = 'something else'

সংকলন

foo = 'bar';
var foo = 'something else';

এবং এখন আপনি নিজেকে fooবিভিন্ন স্কোপে দুটি পেয়েছেন । সেখানে পরিবর্তন করার কোন উপায় আছে বিশ্বব্যাপী foo যেমন আইভি বর্ণনা, গ্লোবাল অবজেক্ট উল্লেখ ছাড়া CoffeeScript কোড থেকে।

অবশ্যই, আপনি কেবল fooকফিস্ক্রিপ্টে যদি কোনও অ্যাসাইনমেন্ট তৈরি করেন তবে এটি কেবল তখনই সমস্যা — যদি fooপ্রাথমিক মান দেওয়ার পরে কেবলমাত্র পঠনযোগ্য হয়ে যায় (যেমন এটি একটি বৈশ্বিক ধ্রুবক), তবে এম্বেড করা জাভাস্ক্রিপ্ট সমাধানের পদ্ধতিটি কন্ডোর্স গ্রহণযোগ্য হতে পারে (যদিও এখনও প্রস্তাবিত নয়)।


1
আমি কফিস্ক্রিপ্টের সাহায্যে টাইটানিয়াম ব্যবহার করছিলাম এটি আমার জন্য একটি কার্যকর সমাধান ছিল। রফতানি এবং উইন্ডো অবজেক্টটি সেখানে অনর্থক।
পিয়ের-অলিভিয়ার থিবল্ট

আসলে এটি কেবলমাত্র একটি স্থানীয় fooভেরিয়েবল, varউত্তোলনের কারণে (জেএস সমস্ত varঘোষণার জন্য স্ক্যান করে এবং তাদের ব্যাখ্যা করে যে তারা ফাংশনের শীর্ষে ছিল)
কর্নেল

আপনি ঠিক আছেন; আমি একটি খারাপ উদাহরণ বাছাই। মুল বক্তব্যটি হ'ল কফিস্ক্রিপ্ট সংকলক ব্যাকটিক-পলাতকৃত জাভাস্ক্রিপ্টের কোনও বিশ্লেষণ করে না, যাতে আপনি বিজোড় আউটপুট পেতে পারেন।
ট্রেভর বার্নহ্যাম

2
@ পিয়ার-অলিভিয়ারটিবোল্ট আপনি যদি টাইটানিয়ামের গ্লোবাল ব্যবহার করতে চান তবে আপনি Ti.app.myGlobalVar = "ইমাগ্লোবালবার" ব্যবহার করতে পারেন এবং ব্যাকটিক্স লাগবে না
জাকব ল্যানার

কমপক্ষে নোড.জেসের জন্য এটি সঠিক উত্তর। করছেন expect = require('chai').expect;তোলে expectপরিবর্তনশীল আমার সব পরীক্ষা ফাইল উপলব্ধ!
পোর্শার

11

আপনি যখন নোড.জেএস এর অধীনে কফি-স্ক্রিপ্টের মাধ্যমে কোডটি সংকলন করেন তখন আপনি বি-বি বিকল্পটি পাস করতে পারেন। সংকলিত কোডটি coffeescript.org এর মতোই হবে।


কিভাবে? আমি -b বিকল্পটি কোথায় রাখব?
হ্যারি

1
@ হ্যারি - -b/ কমান্ডের --bareপরে সরাসরি যায় coffee
ocodo

9

আইভো ওয়েটজেলের উত্তর যুক্ত করতে

এটির জন্য একটি শর্টহ্যান্ড সিনট্যাক্স বলে মনে হচ্ছে exports ? thisআমি কোনও গুগল গ্রুপ পোস্টে কেবলমাত্র ডকুমেন্টেড / উল্লেখ করেছি ।

অর্থাত্ কোনও ওয়েব পৃষ্ঠায় বিশ্বব্যাপী কোনও ফাংশন উপলব্ধ করার জন্য আপনি একটি @উপসর্গ দিয়ে আবার ফাংশনটি ঘোষণা করেন :

<script type="text/coffeescript">
    @aglobalfunction = aglobalfunction = () ->
         alert "Hello!"
</script>

<a href="javascript:aglobalfunction()" >Click me!</a>

9
@Aglobalfunction এর '@' কেবল 'this' দ্বারা প্রতিস্থাপন করা হয়েছে, সুতরাং 'this.aglobalfunction' তে সংকলন করে। এটি কাজ করে কারণ coffeescript মোড়ক ফাংশন (প্রয়োগ করা হয়) এর সুযোগ বিশ্বব্যাপী।
ক্রিস

9

আমি মনে করি আপনি যা অর্জন করার চেষ্টা করছেন তা কেবল এইভাবে করা যেতে পারে:

আপনি যখন কফিসিপিটি সংকলন করছেন তখন "-b" প্যারামিটারটি ব্যবহার করুন।

-b / --bare শীর্ষ স্তরের ফাংশন সুরক্ষা মোড়ক ছাড়াই জাভাস্ক্রিপ্ট সংকলন করুন।

সুতরাং এর মতো কিছু: coffee -b --compile somefile.coffee whatever.js

এটি আপনার কোডটিকে ঠিক কফিস্ক্রিপ্ট.org সাইটের মতো আউটপুট দেবে।


7

আপনি যদি খারাপ ব্যক্তি হন (আমি একজন খারাপ ব্যক্তি)) তবে আপনি এটির মতো সহজ পেতে পারেন: (->@)()

হিসাবে হিসাবে,

(->@)().im_a_terrible_programmer = yes
console.log im_a_terrible_programmer

এই কাজ, কারণ যখন একটি invoking Referenceএকটি থেকে Function'বেয়ার' (যে func()পরিবর্তে new func()বা obj.func()), কিছু সাধারণভাবে 'ফাংশনটি কল আবাহন প্যাটার্ন', বলা সবসময় বেঁধে thisযে জন্য বিশ্বব্যাপী বস্তু ফাঁসি প্রসঙ্গ

উপরের কফিস্ক্রিপ্টটি কেবল সংকলন করে (function(){ return this })(); সুতরাং আমরা বিশ্বব্যাপী অবজেক্টকে নির্ভরযোগ্যভাবে অ্যাক্সেস করতে সেই আচরণটি অনুশীলন করছি।


ইহা অসাধারণ!
6'16 এ ধাতব করুন

আমার পক্ষে একমাত্র কাজ কফি স্ক্রিপ্টকে ঘৃণা করুন।
পিসিভি

কফিস্ক্রিপ্ট পছন্দ। এখন পর্যন্ত এটি সর্বোত্তম প্রোগ্রামিংয়ের ভাষা out খুব খারাপ এটি একটি শখের প্রকল্প হিসাবে তৈরি এবং রক্ষণাবেক্ষণ করা হয়েছিল, এর ব্যবহারের ধরণগুলিতে বিশৃঙ্খলা এবং বোকামির দিকে পরিচালিত করে।
15

3

যেহেতু কফিস্ক্রিপ্টটি নিজেরাই খুব কম ব্যবহৃত হয়, আপনি ব্যবহার করতে পারেন global নোড.জেএস বা ব্রাউজারফাই (এবং কফিফি, গল্প বিল্ড স্ক্রিপ্ট ইত্যাদির মতো যে কোনও বংশধর) সরবরাহ করেছেন ভেরিয়েবল ।

নোড.জেএস এ global হ'ল গ্লোবাল নেমস্পেস।

ব্রাউজারিফিতে globalসমানwindow

সুতরাং, ঠিক:

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