কেন জেএসআইএনটি অভিযোগ করছে যে এটি কঠোর লঙ্ঘন?


98

আমি মনে করি এটি এই কীওয়ার্ডটি ব্যবহার করে এবং মডিউল প্যাটার্নটি প্রকাশ করে স্ট্রাইক লঙ্ঘনের নকল হতে পারে

আমার এই কোডটি রয়েছে:

function gotoPage(s){
    if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);}
}

function pageChange(event, sorter) {
    var dd = event.currentTarget;
    gotoPage.call(sorter, dd[dd.selectedIndex].value);
}

এবং জেএসএনটি (জেএসলিন্ট) অভিযোগ করছে। এটি "কঠোর লঙ্ঘন" বলে। হাইলাইট লাইনের জন্য:

এখানে চিত্র বর্ণনা লিখুন

আমার ব্যবহারটি Function.call()এবং তারপরে উদাহরণটি উল্লেখ করে কোনওভাবে অনুপযুক্ত?

এটি কি খারাপ শৈলী হিসাবে বিবেচনা করা হয়?


এটি কোনও বিশদ ত্রুটি বার্তা ছাড়াই কেবল "কঠোর লঙ্ঘন" বলে?
স্টিভ্লো

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

54
মনে রাখবেন যে আপনি যদি এটি একটি হাস্যকর এক-লাইনারে ক্র্যাম করার চেষ্টা না করেন তবে এটি নির্ণয় করা আরও সহজ হবে: পি।
ডোমেনিক

4
আমি এটি অন্য একটি প্রশ্নে দেখেছি (এখনই এটি খুঁজে পাচ্ছি না)। এটি ব্যবহারের সাথে করতে হবে this। আমি জানি না কেন জেএসলিন্ট এটিকে কঠোর লঙ্ঘন হিসাবে অভিহিত করবে তবে আমি জানি যে আপনি যদি thisকোনও ফাংশনের মান নির্ধারণ না করেন তবে এটি undefinedকঠোর মোডে থাকবে। স্পষ্টতই আপনি সংজ্ঞা দিচ্ছেন this, সুতরাং এটি কোনও সমস্যা হওয়া উচিত নয়।
ব্যবহারকারী 113716

4
আপনি কনফিগ জেসসনের সাথে এই সম্ভাব্য কঠোর লঙ্ঘন উপেক্ষা করতে পারেন "-W040":true, তবে যেহেতু জসনের কোনও মন্তব্য নেই, তবে কেন এটি আছে তা আপনি কাউকে বলতে পারবেন না।
কোজিরো

উত্তর:


124

জেএসহিন্ট "সম্ভাব্য কঠোর লঙ্ঘন" বলেছেন কারণ আপনি এমন কোনও কিছুর thisঅভ্যন্তরে ব্যবহার করছেন যা এটি যতদূর বলতে পারে এটি কোনও পদ্ধতি নয়।

অ-কঠোর মোডে, কলিং গ্লোবাল অবজেক্টের ( ব্রাউজারে) gotoPage(5)আবদ্ধ হবে । কঠোর মোডে, হবে এবং আপনি সমস্যায় পড়বেন।thiswindowthisundefined

সম্ভবত আপনি বোঝাতে চাইছেন এই ফাংশনটি একটি বাউন্ড thisপ্রসঙ্গে, যেমন gotoPage.bind(myObj)(5)বা gotoPage.call(myObj, 5)। যদি তা হয় তবে আপনি জেএসহিন্টকে উপেক্ষা করতে পারবেন, কারণ আপনি কোনও ত্রুটি তৈরি করবেন না। তবে, এটি আপনাকে জানিয়ে দিচ্ছে যে আপনার কোডটি পড়ার জন্য কারও কাছেই অস্পষ্ট, কারণ thisএমন কোনও কিছু যা অভ্যন্তরীনভাবে কোনও পদ্ধতি নয় এটি ব্যবহার করা বেশ বিভ্রান্তিকর। পরামিতি হিসাবে কেবল অবজেক্টটি পাস করা ভাল:

function gotoPage(sorter, s) {
    if (s <= sorter.d && s > 0) {
        sorter.g = s;

        sorter.page((s - 1) * sorter.p.size);
    }
}

function pageChange(event, sorter) {
    var dd = event.currentTarget;
    gotoPage(sorter, dd[dd.selectedIndex].value);
}

12
তবুও, আমি মনে করি তারা বর্ণনায় কিছুটা বিভ্রান্তিকর হচ্ছে। এমনকি যদি thisসত্তাটি শেষ হয় undefinedতবে আসল সমস্যাটি কেবল একটি কঠোর মোড লঙ্ঘন নয়। তারা "সতর্ক মোডে" থাকাকালীন একটি (বা কিছু) বাড়ে এমন একটি সতর্কতা দেওয়ার চেয়ে আরও ভাল thisকরতে পারে । undefinedTypeError
ব্যবহারকারী 113716

11
@ রিপার 234 সত্যই, তাই আমি এর event.currentTargetপরিবর্তে সর্বদা ব্যবহার করি this
ডোমেনিক

4
.jshintrcএই চেকটি অক্ষম করতে আমি কোন কনফিগার নির্দেশকে যুক্ত করতে পারি ?
কলম্ব

7
@ ক্যালাম "বৈধতা": সত্য
ব্রেট

18
আপনার /* jshint validthis: true */যদি কেবল একটি দম্পতি থাকে এবং প্রতিটি ক্ষেত্রে পরিবর্তন করতে না চান তবে ব্যবহার করুন।
21

93

আমার কাছে এই ফাংশনটির জন্য এই বার্তাটি ছিল যা মূলধনপত্র দিয়ে শুরু হয়নি।

"use strict";

// ---> strict violation
function something() {
    this.test = "";
}


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}

28
আমি নোট করব যে জিশিন্ট সম্ভবত ধরে নিচ্ছেন, কনভেনশনের Somethingকারণে, এটি মূলধন এস এর কারণে নির্মাতা এবং তাই এটি ব্যবহার করে ডাকা উচিত newthisএটি করা '`সামথিং.প্রোটোটাইপ' এর উপর ভিত্তি করে একটি নতুন অবজেক্ট হিসাবে সংজ্ঞায়িত করে। এটি সম্ভবত এই কঠোর লঙ্ঘনের সতর্কতা উত্থাপন করে না এমন অনুমানের কারণেই এটি সম্ভবত।
অ্যান্ডি Merts 21

4
আমার একটি AngularJS সরবরাহকারীতে এই ত্রুটি ছিল, সুতরাং উচ্চ-উট-কেস পদ্ধতির নামগুলি প্রত্যাশিত এবং আমার কাছে লোয়ার-উট-কেস ছিল। স্থির।
ডেমিনিটিক্স

আমার একই ধরণের সমস্যা হয়েছিল, যখন একটি ফাংশনের নাম কেবল ছোট হাতের অক্ষরে থাকে, একটি মূলধন ব্যবহার করে নাম পরিবর্তন করে।
গিব্বোক

মূলধনী প্রথম অক্ষরটি ব্যবহার করবেন না কারণ এটিও একজন নির্মাতা, আপনি অন্য সমস্যার মুখোমুখি হবেন। পরিবর্তে, আপনি ব্যবহার করতে পারেন: var fnAbc = ফাংশন () {this.test = ""}
হিউ ট্রান এজিআই

মূলধন পত্র ফাংশনটির অভ্যন্তরীণ কাজগুলি সম্পর্কে কোনও পরিবর্তন করে না। প্রোগ্রামাররা অর্থ বোঝাতে সাধারণত এইভাবে কিছু করে। অন্য কথায়: এটি কোনও প্রযুক্তিগত সমস্যা নয়, তবে homans এর মধ্যে যোগাযোগের একটি।
অ্যাথেন্স

9

আপনি যদি স্ট্যান্ডার্ড ফাংশন ডিক্লেয়ারেশন ব্যবহার না করে ফাংশনটিকে পরিবর্তনশীল হিসাবে ঘোষণা করেন, jshint এটিকে কঠোর লঙ্ঘন হিসাবে চিহ্নিত করবে না। সুতরাং আপনি নিম্নলিখিতটি করতে পারেন -

var gotoPage = function (s){
    if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);}
};


var pageChange = function (event, sorter) {
    var dd = event.currentTarget;
    gotoPage.call(sorter, dd[dd.selectedIndex].value);
};

0

আপনি যদি কোনও পদ্ধতি বাস্তবায়নের চেষ্টা করছেন তবে আপনি তার পরিবর্তে প্রোটোটাইপটি অর্পণ করতে চাইতে পারেন:

ExampleClassName.protytpe.gotoPage = function gotoPage(s){
  // code using this
};

ফাংশনটি নির্ধারিত হওয়ার সময় জেএসহিন্ট সতর্ক করবে না।


এখনও যথেষ্ট ভাল না। ClassName.prototype.myMethod = myMethod;তারপরে নীচের পদ্ধতিটি সংজ্ঞায়িত করুন। আপনি এখনও একটি ত্রুটি পান যদিও মাইমাথোদ সঠিকভাবে আবদ্ধ।
জেফটপিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.