2011-10-07 39 views
95

मुझे लगता है कि यह Strict Violation using this keyword and revealing module patternजेएसएचआईएनटी शिकायत क्यों कर रहा है कि यह सख्त उल्लंघन है?

का डुप्लिकेट हो सकता है मेरे पास यह कोड है:

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) शिकायत कर रहा है। यह कहता है "सख्त उल्लंघन।" हाइलाइट लाइन के लिए:

enter image description here

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

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

+0

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

+0

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

+50

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

उत्तर

121

जेएसहिंट कहता है "संभावित सख्त उल्लंघन" क्योंकि आप this का उपयोग कर रहे हैं, जहां तक ​​यह कह सकता है, एक विधि नहीं है।

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

संभवतः, आप इस फ़ंक्शन को 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); 
} 
+2

आप शायद सही हैं कि इसकी शिकायत यह है कि फ़ंक्शन परिभाषित नहीं किया गया है * स्पष्ट रूप से * एक विधि के रूप में।जेएसलिंट/संकेत के लिए मूर्खतापूर्ण लगता है कि इसे * * सख्त उल्लंघन "कहें। – user113716

+0

वेब इंटरफ़ेस और नवीनतम संस्करण में, यह इसे "_possible_ सख्त उल्लंघन" कहते हैं। – Domenic

+12

फिर भी, मुझे लगता है कि वे विवरण में थोड़ा भ्रामक हैं। भले ही 'यह' अपरिभाषित 'हो रहा है, फिर * वास्तविक * समस्या केवल एक * सख्त मोड * उल्लंघन नहीं है। वे चेतावनी देने के लिए बेहतर करेंगे कि "सख्त मोड" में 'यह' अपरिभाषित 'हो सकता है, जिससे' TypeError' (या कुछ) हो जाता है। – user113716

91

मेरे पास यह संदेश एक ऐसे फ़ंक्शन के लिए है जो पूंजी पत्र से शुरू नहीं हुआ है।

"use strict"; 

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


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

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

+4

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

+0

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

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 चेतावनी नहीं होगा समारोह है जब असाइन किया जा रहा है।

+0

अभी भी पर्याप्त अच्छा नहीं है। 'ClassName.prototype.myMethod = myMethod; ', फिर नीचे दी गई विधि को परिभाषित किया गया। MyMethod सही ढंग से बाध्य होने के बावजूद आपको अभी भी एक त्रुटि मिलती है। – Jefftopia