JSHINT शिकायत क्यों कर रहा है कि यह एक सख्त उल्लंघन है?


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);
}

और JSHINT (JSLINT) शिकायत कर रही है। यह कहता है "सख्त उल्लंघन।" हाइलाइट की गई लाइन के लिए:

यहां छवि विवरण दर्ज करें

क्या मेरा उपयोग Function.call()और फिर उदाहरण को संदर्भित करना, किसी तरह अनुचित है?

क्या इसे खराब शैली माना जाता है?


क्या यह केवल "स्ट्रिक्ट उल्लंघन" कहता है, बिना किसी विस्तृत त्रुटि संदेश के?
stivlo

मैं समस्या को पुन: उत्पन्न नहीं कर सकता, मैंने JSHint और JSLint के माध्यम से कोड चलाया और यह किसी भी चीज़ के बारे में शिकायत नहीं कर रहा है।
पीटर ओल्सन

54
ध्यान दें कि यह निदान करना बहुत आसान होगा यदि आपने इसे हास्यास्पद एक-लाइनर में रटना करने की कोशिश नहीं की: पी।
डोमोनिक

1
मैंने इसे एक अन्य प्रश्न में देखा है (इसे अभी नहीं पा सकते हैं)। के उपयोग के साथ यह करना है this। मुझे नहीं पता कि JSLint इसे एक सख्त उल्लंघन क्यों कहेगा, लेकिन मुझे पता है कि यदि आप thisकिसी फ़ंक्शन के मूल्य को परिभाषित नहीं करते हैं , तो यह undefinedसख्त मोड में होगा । स्पष्ट रूप से आप परिभाषित कर रहे हैं this, इसलिए यह एक मुद्दा नहीं होना चाहिए।
14:11 पर user113716

2
आप इन अनदेखा कर सकते हैं संभव सख्त उल्लंघन के साथ "-W040":trueconfig json में, लेकिन जब से json टिप्पणी नहीं है, आप किसी को भी कारण है कि यह वहाँ नहीं बता सकता।
कोजिरो

जवाबों:


124

JSHint "संभावित सख्त उल्लंघन" कहता है क्योंकि आप thisकिसी ऐसी चीज़ का उपयोग कर रहे हैं , जहाँ तक वह बता सकती है, एक विधि नहीं है।

गैर-सख्त मोड में, कॉलिंग वैश्विक ऑब्जेक्ट ( ब्राउज़र में) के लिए gotoPage(5)बाध्य होगी । सख्त मोड में, होगा , और आप मुसीबत में पड़ेंगे।thiswindowthisundefined

मुमकिन है, आप इस फ़ंक्शन को एक बाध्य thisसंदर्भ, जैसे gotoPage.bind(myObj)(5)या gotoPage.call(myObj, 5)। यदि हां, तो आप JSHint को अनदेखा कर सकते हैं, क्योंकि आप कोई त्रुटि उत्पन्न नहीं करेंगे। लेकिन, यह आपको बता रहा है कि इसे पढ़ने वाले किसी भी व्यक्ति के लिए आपका कोड अस्पष्ट है, क्योंकि किसी 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हो सकता है undefinedजब "सख्त मोड" में, एक TypeError(या कुछ) के लिए अग्रणी हो ।
15:11 बजे user113716

11
@ ripper234 वास्तव में, यही कारण है कि मैं हमेशा के event.currentTargetबजाय का उपयोग करें this
दिनमान

4
.jshintrcइस चेक को अक्षम करने के लिए मैं कौन सा कॉन्फिक्टिव डायरेक्शन जोड़ सकता हूं ?
17

7
@ कल्लुम "मान्य": सच
ब्रेट

18
उपयोग करें /* jshint validthis: true */यदि आपके पास केवल एक युगल है और हर मामले के लिए बदलना नहीं चाहते हैं।
knownasilya

93

मेरे पास यह संदेश एक फ़ंक्शन के लिए है जो एक बड़े अक्षर से शुरू नहीं हुआ था।

"use strict";

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


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

28
मैं ध्यान दूंगा कि जिश्ट संभवतः मान रहे हैं, सम्मेलन के कारण, जो कि Somethingराजधानी एस के कारण एक निर्माणकर्ता है, और इसलिए इसका उपयोग किया जाना चाहिए new। ऐसा करना this। समथिंग.प्रोटोटाइप ’पर आधारित एक नई वस्तु होने को परिभाषित करता है। यह उस धारणा के कारण सबसे अधिक संभावना है कि यह संभावित सख्त उल्लंघन चेतावनी को नहीं बढ़ाता है।
एंडी मर्स

4
मुझे एक AngularJS प्रदाता पर यह त्रुटि थी, इसलिए ऊपरी-ऊंट-केस विधि नामों की अपेक्षा की जाती है और मेरे पास कम ऊँट-केस था। फिक्स्ड।
डेमिनिटिक्स

मुझे भी इसी तरह की समस्या थी, जब एक फंक्शन का नाम केवल लोअरकेस होता था, जिसका नाम बदलकर कैपिटल का उपयोग किया जाता था।
जिब्बो

पूंजी पहले अक्षर का उपयोग न करें क्योंकि यह एक निर्माता भी है, आपको एक और समस्या का सामना करना पड़ेगा। इसके बजाय, आप उपयोग कर सकते हैं: var fnAbc = function () {this.test = ""}
Hieu Tran AGI

फ़ंक्शन के आंतरिक कामकाज के बारे में पूंजी पत्र कुछ भी नहीं बदलता है। यह सिर्फ कुछ प्रोग्रामर है जो आमतौर पर अर्थ व्यक्त करने के लिए इस तरह से करते हैं। दूसरे शब्दों में: यह एक तकनीकी समस्या नहीं है, लेकिन समलैंगिकों के बीच संचार में से एक है।
एंथेसिस

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
};

JSHint चेतावनी नहीं देगा जब फ़ंक्शन सौंपा जा रहा है।


फिर भी ठीक नहीं हुआ। ClassName.prototype.myMethod = myMethod;, तो नीचे दी गई विधि को परिभाषित किया। आपको अभी भी एक त्रुटि मिलती है, जबकि myMethod सही ढंग से बाध्य है।
जेफटोपिया 14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.