„Javascript / jsLint“: ką pakeisti „jQuery“ (tai), kai naudojate „naudoti griežtą“;

Kai patikrinu šį kodą naudojant jslint, gaunu šias klaidas.

 function displayMegaDropDown() { "use strict"; var liMegaPosition, divMegaOffset; liMegaPosition = jQuery(this).position(); divMegaOffset = { top: liMegaPosition.top + jQuery(this).height(), left: liMegaPosition.left }; jQuery(this).find("div").offset(divMegaOffset); jQuery(this).addClass("hovering"); } 

Problema su simbolių eilute 4 29: Sunkus pažeidimas.

  liMegaPosition = jQuery(this).position(); 

Problema su 5 eilutės simboliu: sunkus pažeidimas.

 divMegaOffset = { top: liMegaPosition.top + jQuery(this).height(), left: liM... 

Problema su linijos simboliu 6 12: sunkus pažeidimas.

 jQuery(this).find("div").offset(divMegaOffset); 

Su simbolių eilutės 8 problema: sunkus pažeidimas.

 jQuery(this).addClass("hovering"); 

Manau, kad tai yra dėl jQuery (tai) naudojimo, bet aš nesuprantu, ką jį pakeisti. Atkreipkite dėmesį, kad tai nėra todėl, kad jQuery nėra paskelbta pasauline.

23
04 сент. Sarge rinkinys 04 rugsėjis 2011-09-04 17:55 '11 at 17:55 pm 2011-09-04 17:55
@ 4 atsakymai

Manau, kad problema ta, kad jūs nenaudojate this metodo viduje. Sekantis kodas

  var myObj = { myNethod: function displayMegaDropDown() { "use strict"; var ts = jQuery(this), liMegaPosition = ts.position(), divMegaOffset = { top: liMegaPosition.top + ts.height(), left: liMegaPosition.left }; ts.find("div").offset(divMegaOffset); ts.addClass("hovering"); } }; 

arba tai

  function displayMegaDropDown(t) { "use strict"; var ts = jQuery(t), liMegaPosition = ts.position(), divMegaOffset = { top: liMegaPosition.top + ts.height(), left: liMegaPosition.left }; ts.find("div").offset(divMegaOffset); ts.addClass("hovering"); } 

nesuteiks jokių klaidų ar įspėjimų.

Atnaujinta . Kita versija, kuri yra labai arti jūsų originalo, taip pat neturi klaidų ar įspėjimų:

  var displayMegaDropDown = function () { "use strict"; var ts = jQuery(this), liMegaPosition = ts.position(), divMegaOffset = { top: liMegaPosition.top + ts.height(), left: liMegaPosition.left }; ts.find("div").offset(divMegaOffset); ts.addClass("hovering"); }; 

Atnaujinta 2 . Manau, kad šis klausimas įdomus. Taigi žiūriu į ECMAScript standartą . „C priede (informatyvus)„ Griežtas ECMAScript režimas “(žr. Aukščiau HTML versijoje čia ):

Jei tai vertinama griežto režimo kodu, šio objekto vertė nėra taikoma. Šios nulinės ar neapibrėžtos reikšmės nėra konvertuojamos į pasaulinį objektą, o primityviosios vertės nekoreguojamos apvyniojimo objektams. Šios vertės vertė perduodama per funkcijų skambutį (įskaitant skambučius, atliktus naudojant funkciją .prototipas.apply ir Funkcija.

Manau, kad tai yra JSLint klaidos priežastis.

Jei išjungsite griežtą režimą, kodu nebus daugiau klaidų:

   function displayMegaDropDown() { var ts = jQuery(this), liMegaPosition = ts.position(), divMegaOffset = { top: liMegaPosition.top + ts.height(), left: liMegaPosition.left }; ts.find("div").offset(divMegaOffset); ts.addClass("hovering"); } 

Atnaujinta 3: Atrodo, kad daugelio žmonių įtariama, kad tai neįmanoma panaudoti funkcijai išreikšti ir galimybei ją naudoti išreiškiant funkciją. Šiandien aš gavau kitą komentarą. Taigi sukūriau labai paprastą demonstraciją.

  (function () { 'use strict'; function test() { alert(this); } test(); }()); 

Jūs galite išbandyti ją čia , kad IE9 pateiktumėte įspėjimą su tekstu "[objekto >

Taigi problema naudojant this funkcijų aprašą yra ne „jslint“ dalykas. Tai yra reali problema, kurią turėtumėte apsvarstyti kuriant „JavaScript“ programas.

Aš asmeniškai norėčiau naudoti funkcijų išraišką ir beveik niekada nenaudoju daugiau funkcijų operatorių. Manau, kad žmonės, atvykę iš kitų programavimo kalbų (pvz., Aš), bando pirmiausia naudoti tą patį konstruktą, kuris buvo geras jūsų mėgstamose kalbose. Tik vėliau paaiškėja, kad kintamųjų apibrėžimas bloke yra blogas („JavaScript“ nėra blokų lygio srities) ir kad funkcijų operatoriai ne visada yra geriausias pasirinkimas.

20
04 сент. atsakymas suteiktas Olego 04 sep. 2011-09-04 19:32 '11, 19:32, 2011-09-04 19:32

Kode nėra griežto režimo pažeidimo. Jei taip būtų, gausite tam tikrą klaidą.

border=0
2
04 сент. Atsakymą pateikė user113716 04 Sep. 2011-09-04 18:00 '11 18:00 val. 2011-09-04 18:00

Daug lengviau! Vietoj to naudokite ev.currentTarget. Tai yra tas pats dalykas, kurį galite patikrinti su ===

 function event_handler(ev) { //var $el = $(this); // jshint - error var $el = $(ev.currentTarget); // is exactly the same as above } 
1
25 февр. atsakymas pateikiamas zevero 25 vasario mėn. 2017-02-25 14:42 '17, 14:42 pm 2017-02-25 14:42

Naudojant įmontuotą javascript, this bus undefined strict mode , jei funkcija yra, ji taip pat nėra vadinama:

  • kaip objekto metodas
  • Function.call arba Function.apply
  • kaip konstruktorius

Dėl šios priežasties jshint tai skundžiasi.

Tačiau, jei funkcija naudojama kaip renginio tvarkytojas, skirtas jQuery, jQuery priverčia $(this) kaip jQuery DOM objektą, kuris kelia įvykį.

Norėdami tai įrodyti, atidarykite šio puslapio konsolę ir paleiskite šį kodą.

 (function(){ "use strict"; function event_handler() { $(this).css('background','red'); } $('#content').on('click', 'table', event_handler); })(); 

Spustelėkite bet kurį klausimą ar atsakymą šiame puslapyje ir pamatysite, kad fonas tampa raudonas.

1
10 янв. Atsakymą pateikė Malcolm Kee 10 sausis 2017-01-10 16:33 '17 at 4:33 2017-01-10 16:33

Kiti klausimai apie „ etiketes „ arba „ Klauskite“