Prev: FAQ Entry Proposal: What is (function(){ /*...*/ })() ?
Next: FAQ Topic - What is Ajax? (2010-03-01)
From: "Michael Haufe ("TNO")" on 1 Mar 2010 03:05 On Mar 1, 1:19 am, David Mark <dmark.cins...(a)gmail.com> wrote: > I'm not big on Mozilla strict mode though. IIRC, many of its warnings > are arbitrary (even more so than JSLint). Complaining about anonymous > functions that don't return anything comes to mind. I haven't seen such an issue myself. Take for example: -------------------------------- function foo1(){} function foo2(){ return false; } function foo3(){ if(true) return 1; else return 0; } function foo4(){ if(true) return 1 } (function(){})(); -------------------------------- The only warning you'll receive is from foo4. I think this is reasonable. If it was smarter it could flag the anonymous function and foo1 as useless statements as well which would be reasonable as well IMO.
From: "Michael Haufe ("TNO")" on 1 Mar 2010 03:06 On Mar 1, 2:05 am, "Michael Haufe (\"TNO\")" <t...(a)thenewobjective.com> wrote: > The only warning you'll receive is from foo4. I think this is > reasonable. If it was smarter it could flag the anonymous function and > foo1 as useless statements as well which would be reasonable as well > IMO. s/be reasonable as well/be reasonable
From: David Mark on 1 Mar 2010 03:16 Michael Haufe ("TNO") wrote: > On Mar 1, 1:19 am, David Mark <dmark.cins...(a)gmail.com> wrote: > >> I'm not big on Mozilla strict mode though. IIRC, many of its warnings >> are arbitrary (even more so than JSLint). Complaining about anonymous >> functions that don't return anything comes to mind. > > I haven't seen such an issue myself. Take for example: It's been a while since I used it. I may be remembering the lint that runs on Dojo check-ins. It was passable for 99% of their files (once they were cleaned up and cleared by JSLint, of course), but for the remainder I had to disable verification with a !strict directive. As an aside, every time I visit their trac, I see that virtually every check-in uses !strict, which is self-defeating and what led to the various typos and other mistakes I found when going through their stuff. Some people never learn. > -------------------------------- > function foo1(){} > function foo2(){ return false; } > function foo3(){ > if(true) > return 1; > else > return 0; > } > function foo4(){ > if(true) > return 1 > } > > (function(){})(); > -------------------------------- > > The only warning you'll receive is from foo4. I think this is > reasonable. If it was smarter it could flag the anonymous function and > foo1 as useless statements as well which would be reasonable as well > IMO. Yes, I agree with that.
From: lorlarz on 1 Mar 2010 09:43 On Mar 1, 12:04 am, lorlarz <lorl...(a)gmail.com> wrote: > On Feb 28, 9:09 pm, lorlarz <lorl...(a)gmail.com> wrote: > [snip] For convenience, I thought it would be good to just refer to ONE file (one document) regarding all the changes I needed to make to get jQuery 1.4.2 all the way through JSLint **_AND_** the remaining errors found (in particular, their line numbers) NOW referring to the SAME jQuery 1.4.2 Development Verson (obtainable from http://jquery.ocm ). OK. Here it is. Directions: Simply make the following changes to the Development version of jQuery 1.4.2 : 2649 changed to: var origContext = context || document; // = contents before = contents removed lines 2663 to 2673 commented out 2985 changed to: var nodeCheck = part.toLowerCase(); // = part before = part removed 2995 changed to: var nodeCheck = part.toLowerCase(); // = part before = part removed 3317 changed to Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]* \))/.source) ); // parentheses added on expression after + sign 4167 commented out 4775 commented out 5994 prevOffsetParent = offsetParent; offsetParent = elem.offsetParent; // (comma in middle changed to semi-colon) 6035 checkDiv.style.position = "fixed"; checkDiv.style.top = "20px"; // (comma in middle changed to semi-colon) 6040 innerDiv.style.overflow = "hidden"; innerDiv.style.position = "relative"; // (comma in middle changed to semi-colon) *********************** *********************** **THEN** run that file (documewnt) as so changed through JSLint and you get the following error report of remaining errors: (line numbers now referring to lines in that document): Error: Problem at line 16 character 20: Expected an identifier and instead saw 'undefined' (a reserved word). (function( window, undefined ) { Problem at line 38 character 48: Unescaped '-'. quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, Problem at line 69 character 20: 'hasOwnProperty' is a really bad name. hasOwnProperty = Object.prototype.hasOwnProperty, Problem at line 204 character 20: Use '===' to compare with 'null'. return num == null ? Problem at line 330 character 41: Use '!==' to compare with 'null'. if ( (options = arguments[ i ]) != null ) { Problem at line 441 character 48: Use '===' to compare with 'null'. toplevel = window.frameElement == null; Problem at line 595 character 20: Use '!==' to compare with 'null'. if ( array != null ) { Problem at line 599 character 31: Use '===' to compare with 'null'. if ( array.length == null || typeof array === "string" || jQuery.isFunctio... Problem at line 648 character 18: Confusing use of '!'. if ( !inv !== !callback( elems[ i ], i ) ) { Problem at line 648 character 18: Confusing use of '!'. if ( !inv !== !callback( elems[ i ], i ) ) { Problem at line 665 character 24: Use '!==' to compare with 'null'. if ( value != null ) { Problem at line 713 character 4: Mixed spaces and tabs. []; Problem at line 823 character 21: Missing '()' invoking a constructor. return (new Date).getTime(); Problem at line 913 character 13: 'e' is already defined. } catch(e) { Problem at line 1476 character 28: Expected an assignment or function call and instead saw an expression. parent.selectedIndex; Problem at line 1480 character 43: Expected an assignment or function call and instead saw an expression. parent.parentNode.selectedIndex; Problem at line 1592 character 55: 'eventHandle' is already defined. eventHandle = elemData.handle, eventHandle; Problem at line 1724 character 106: Missing semicolon. jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\ \.)?")... Problem at line 1748 character 25: 'j' is already defined. for ( var j = pos || 0; j < eventType.length; j++ ) { Problem at line 1754 character 34: Use '===' to compare with 'null'. if ( pos == null ) { Problem at line 1763 character 30: Use '!==' to compare with 'null'. if ( pos != null ) { Problem at line 1770 character 48: Use '!==' to compare with 'null'. if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { Problem at line 1893 character 26: 'e' is already defined. } catch (e) {} Problem at line 1907 character 30: Bad assignment. event = arguments[0] = jQuery.event.fix( event || window.event ); Problem at line 1919 character 20: 'events' is already defined. var events = jQuery.data(this, "events"), handlers = events[ event.type ]; Problem at line 1919 character 60: 'handlers' is already defined. var events = jQuery.data(this, "events"), handlers = events[ event.type ]; Problem at line 1989 character 26: Use '===' to compare with 'null'. if ( event.pageX == null && event.clientX != null ) { Problem at line 1989 character 51: Use '!==' to compare with 'null'. if ( event.pageX == null && event.clientX != null ) { Problem at line 2275 character 19: Use '!==' to compare with 'null'. if ( data != null || val ) { Problem at line 2487 character 39: Use '!==' to compare with 'null'. while ( (type = types[ i++ ]) != null ) { Problem at line 2516 character 18: Don't make functions within a loop. }); Problem at line 2525 character 6: Missing semicolon. } Problem at line 2632 character 56: Unescaped '['. var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"] [^'"]*['"]... Problem at line 2632 character 81: Unescaped '['. var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"] [^'"]*['"]... Problem at line 2702 character 21: 'ret' is already defined. var ret = seed ? Problem at line 2722 character 26: Use '===' to compare with 'null'. if ( pop == null ) { Problem at line 2738 character 23: 'cur' used out of scope. Sizzle.error( cur || selector ); Problem at line 2745 character 42: Use '!==' to compare with 'null'. for ( var i = 0; checkSet[i] != null; i++ ) { Problem at line 2751 character 25: 'i' is already defined. for ( var i = 0; checkSet[i] != null; i++ ) { Problem at line 2751 character 42: Use '!==' to compare with 'null'. for ( var i = 0; checkSet[i] != null; i++ ) { Problem at line 2798 character 40: 'match' is already defined. var type = Expr.order[i], match; Problem at line 2807 character 26: Use '!==' to compare with 'null'. if ( set != null ) { Problem at line 2828 character 64: Use '!==' to compare with 'null'. if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { Problem at line 2853 character 58: Use '!==' to compare with 'null'. for ( var i = 0; (item = curLoop[i]) != null; i++ ) { Problem at line 2858 character 51: Use '!==' to compare with 'null'. if ( inplace && found != null ) { Problem at line 2890 character 27: Use '===' to compare with 'null'. if ( anyFound == null ) { Problem at line 2910 character 35: Unescaped '-'. ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, Problem at line 2911 character 39: Unescaped '-'. CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, Problem at line 2912 character 48: Unescaped '-'. NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, Problem at line 2913 character 41: Unescaped '-'. ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?) \3|)\s*... Problem at line 2914 character 38: Unescaped '-'. TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, Problem at line 2915 character 65: Unescaped '-'. CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, Problem at line 2916 character 69: Unescaped '-'. POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, Problem at line 2917 character 39: Unescaped '-'. PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\ (\)]*)... Problem at line 2967 character 29: 'i' is already defined. for ( var i = 0, l = checkSet.length; i < l; i++ ) { Problem at line 2967 character 36: 'l' is already defined. for ( var i = 0, l = checkSet.length; i < l; i++ ) { Problem at line 2968 character 30: 'elem' is already defined. var elem = checkSet[i]; Problem at line 2989 character 61: 'nodeCheck' used out of scope. checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); Problem at line 2999 character 66: 'nodeCheck' used out of scope. checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); Problem at line 3034 character 56: Use '!==' to compare with 'null'. for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { Problem at line 3120 character 29: Expected an assignment or function call and instead saw an expression. elem.parentNode.selectedIndex; Problem at line 3133 character 20: Wrap the /regexp/ literal in parens to disambiguate the slash operator. return /h\d/i.test( elem.nodeName ); Problem at line 3163 character 20: Wrap the /regexp/ literal in parens to disambiguate the slash operator. return /input|select|textarea|button/i.test(elem.nodeName); Problem at line 3203 character 29: 'i' is already defined. for ( var i = 0, l = not.length; i < l; i++ ) { Problem at line 3227 character 32: Expected a 'break' statement before 'case'. node = elem; Problem at line 3277 character 34: Use '!==' to compare with 'null'. elem[ name ] != null ? Problem at line 3284 character 27: Use '===' to compare with 'null'. return result == null ? Problem at line 3320 character 6: Don't make functions within a loop. })); Problem at line 3339 character 77: Expected an assignment or function call and instead saw an expression. Array.prototype.slice.call( document.documentElement.childNodes, 0 ) [0].node... Problem at line 3354 character 29: 'i' is already defined. for ( var i = 0; array[i]; i++ ) { Problem at line 3443 character 34: Missing '()' invoking a constructor. id = "script" + (new Date).getTime(); Problem at line 3686 character 1: Unreachable 'window' after 'return'. window.Sizzle = Sizzle; Problem at line 3693 character 11: 'slice' is already defined. slice = Array.prototype.slice; Problem at line 3699 character 20: Confusing use of '!'. return !!qualifier.call( elem, i, elem ) === keep; Problem at line 4114 character 49: Use '!==' to compare with 'null'. for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { Problem at line 4131 character 49: Use '!==' to compare with 'null'. for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { Problem at line 4320 character 9: Inner functions should be listed at the top of the outer function. function root( elem, cur ) { Problem at line 4320 character 22: 'root' was used before it was defined. function root( elem, cur ) { Problem at line 4424 character 50: Use '!==' to compare with 'null'. for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { Problem at line 4492 character 25: 'i' is already defined. for ( var i = 0; ret[i]; i++ ) { Problem at line 4513 character 50: Use '!==' to compare with 'null'. for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { Problem at line 4628 character 13: Function statements cannot be placed in blocks. Use a function expression or move the statement to the top of the outer function. function getWH() { Problem at line 4749 character 24: 'name' is already defined. for ( var name in options ) { Problem at line 4868 character 24: Use '===' to compare with 'null'. return val == null ? Problem at line 5052 character 41: Bad operand. if ( s.global && ! jQuery.active++ ) { Problem at line 5238 character 17: 'e' is already defined. } catch(e) { } Problem at line 5253 character 17: 'e' is already defined. } catch(e) { Problem at line 5276 character 26: 'complete' was used before it was defined. function complete() { Problem at line 5293 character 25: 'trigger' is already defined. function trigger(type, args) { Problem at line 5404 character 9: Inner functions should be listed at the top of the outer function. function buildParams( prefix, obj ) { Problem at line 5404 character 29: 'buildParams' was used before it was defined. function buildParams( prefix, obj ) { Problem at line 5423 character 45: Use '!==' to compare with 'null'. } else if ( !traditional && obj != null && typeof obj === "object" ) { Problem at line 5444 character 19: Unescaped '-'. rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/, Problem at line 5531 character 24: Use '===' to compare with 'null'. } else if ( fn == null || bool ) { Problem at line 5589 character 31: Use '!==' to compare with 'null'. if ( opt.overflow != null ) { Problem at line 5744 character 35: Use '!==' to compare with 'null'. if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[t... Problem at line 5744 character 94: Use '===' to compare with 'null'. if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[t... Problem at line 5816 character 43: Use '!==' to compare with 'null'. if ( this.options.display != null ) { Problem at line 5887 character 1: Mixed spaces and tabs. fast: 200, Problem at line 5888 character 1: Mixed spaces and tabs. // Default speed Problem at line 5889 character 1: Mixed spaces and tabs. _default: 400 Problem at line 5898 character 60: Use '!==' to compare with 'null'. if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { Problem at line 5915 character 15: 'genFx' was used before it was defined. function genFx( type, num ) { Problem at line 6203 character 25: Use '===' to compare with 'null'. return size == null ? null : this;
From: lorlarz on 1 Mar 2010 10:39
On Feb 28, 10:45 pm, David Mark <dmark.cins...(a)gmail.com> wrote: > lorlarz wrote: [snip] > > Yes, I saw those. I'll look at them when I have a chance. But > basically it indicates what I expected (even after all of these years, > the code is still hopelessly amateurish). And I'm not at all surprised > that Resig is quick to dismiss the results. That's what he does. > That's all he does. And he absolutely will not stop until his project > is dead. :) > > > I do very much value all your inputs. They are almost always helpful > > -- > > even when some meaness is thrown in. David Mark did help me. > > Thanks, David > > NP. Thanks for asking. It is good to question jQuery. If more people > would take the time to do that, perhaps it would fade away. Take bad > logic and bad style and authors who clearly won't consider anything but > their own delusions and you've got a clear candidate for history's bit > bucket.- Hide quoted text - > > - Show quoted text - David, It my brief communication with John Resig _and_, given the errors I found and had to correct to get more than 41% of jQuery 1.4.2 through JSLint, I do not believe Resig even sent jQuery 1.4.2 through JSLint. I have emailed him. But if he looks at JSLint results, I believe it is likely the run results I provided may well be the first he has seen. |