为什么我发现JavaScript / jQuery如此难以正确?
我的背景是在C,我已经拿起PHP,MySQL,HTML,CSS没有太多的问题。
但是我发现Javascript / jQuery令人惊讶地很难正确的。 非常令人沮丧。 为什么?
-
它似乎违反了一些传统的编程原则(例如可变范围)
-
未定义的variables似乎无处不在,已经有了与它们相关的值。 例如(从jQuery文档):
$("a").click(function(event) { event.preventDefault(); $('<div/>') .append('default ' + event.type + ' prevented') .appendTo('#log'); });
什么是“事件”? 我必须使用这个variables名吗? 我应该假设这个对象是神奇的实例化正确的东西,我可以使用JQuery API的任何方法列表?
-
似乎有一堆随机规则(例如返回false来停止默认操作,但有时这不起作用?)
-
debugging时的非确定性行为。 (例如,我刷新浏览器,尝试一些并获得结果X的JSvariables我在Firebug中看,我再次刷新,我得到的结果Y?)
-
很难看的代码非常混乱。 什么时候发生? 我使用的是Firebug和Chrome开发者工具,但是我没有得到足够的知名度。
似乎每天都有一些随机的JS“规则”出现,我从来没有见过任何我的JS书籍或教程。
为了使Javascript / jQuery更具有确定性,可控性和逻辑性,我需要做些什么?
有没有解释Javascript的怪癖/陷阱的资源?
谢谢!
道格拉斯·克罗克福德的“ Javascript:好的部分 ”是一个非常宝贵的资源。 Javascript比C更像Lua,Lisp或Python,它恰好就像C.
提供给亚马逊的链接; 我从O'Reilly那里拿走了我的东西。
1)这似乎违反了一些传统的编程原则(如variables范围)
您需要使用var
声明variables,否则它将进入全局范围。
2)未定义的variables似乎不知从何而来,已经有了与之相关的价值(这是怎么发生的?)
这可能与1)和/或4)有关。
3)似乎有一堆随机规则(例如返回false来停止默认操作,但有时这不起作用?)
您还需要让处理程序返回false。 例如, form onsubmit="return functionname()"
。 您还需要从“main”函数返回,而不仅仅是从一个闭包(函数内部的一个函数),引用您以前的问题 。 它只会返回到“主”function并继续。
4)debugging时的非确定性行为。 (例如,我刷新浏览器,尝试一些并获得结果X的JSvariables我在Firebug中看,我再次刷新,我得到的结果Y?)
可能代码在HTML DOM完成填充之前被执行。 你需要钩上window.onload
或者$(document).ready()
当你想在页面加载的时候执行东西。
5)很难看的代码很难看。 什么时候发生? 我使用的是Firebug和Chrome开发者工具,但是我没有得到足够的知名度。
我敢打赌,你在谈论jQuery的源代码? 这只是一个大型图书馆。 debugging时应该不用担心这个问题。 而不用担心你自己的代码。 不过,请确保您正在查看jQuery源代码的非最小版本。
也可以看看:
- JavaScript:糟糕的部分
- 每个JavaScript程序员都应该知道什么
说实话,我认为你有一个很好的理解。 我的一些hangups是相似的。 我一直在继续的方式是“好的,如果事情是这样的话,就是这样”。 只要接受这些特质就可以了。 PHP做了一些相同的事情(variables可能会出现无处不在,等等)。 只需编码你想要的代码,如果它的工作,那么太棒了!
然后,当你到达这一点时,开始打破探查器,看看是否有什么你可以优化。
这里有几件事情:
如果你理解CSS,那么jQueryselect器应该很容易。 就代码而言,如果你可以处理链接和JSON,这也很简单。 编辑:另外,一切的jQuery文档是优秀的! 在这里,我们并不缺lessjQuery专家来帮助我们的noobs(希望我们可以返回给新noobs的青睐)。
有一个工作的范围。 (基本上)任何写在函数或对象之外的东西都在全局范围内。 如果你在一个对象或函数内部并使用var
那么它设置variables的作用域
Javascript不像C语言(甚至是C ++或PHP)。 它使用原型来处理类/对象关系而不是子类化scheme。
扔给我一个循环的第一件事是任何出现在页面上的JS或包含在<script>
标签中的JS都是公平的游戏。 如果你在一个脚本中有一个全局variables,你可以在一个完全不同的脚本中使用同一个variables,它将起作用。 这可能是你的意思是变化无处显示。 此外,还有一些基于DOM的variables也可以“显示”。
无论如何,我认为,如果你只是前进,你会得到一些“AHA”的时刻。 我是编程的一个相对低级的人,但是只要我不挂断那些对代码运行没有太大影响的东西,我就会不断增长。
-
它是一种基于原型inheritance的语言,受函数式编程语言和范例的影响,所以它不像其他语言那样完全是OO / Procedural。 variables是隐含的全局variables,除非用
var
声明。 -
请包括一个例子?
-
return false
与任何语言的return语句一样,退出函数。preventDefault()
将是取消链接默认行为的DOM方法 -
JavaScript主要用于客户端。 由于有许多用户代理,他们每个人都有不同的DOM实现,这是非常不一致的,比JS本身更重要。 再次请包括一个真实的例子来得到一个明确的答案。
-
你会发现在任何语言看起来凌乱的代码,也许你的理解缺乏认为代码杂乱,实际上并没有那么糟糕。 或者,也许你正在看一些缩小/混淆的代码。
我build议http://eloquentjavascript.net/学习Javascript的方面。;
你会从上面的链接学到的东西
- lambdaexpression式
- closures
- 原型inheritance
- 基于事件的编程
- debugging
- DOM
道格拉斯·克罗克福德的“JavaScript:好的部分”是一个好的开始
在你的情况下,附录(“坏的部分”和“可怕的部分”)可能是最有趣的:)
克罗克福德的“ Javascript:好的部分 ”给出了一些常见的JS模式,有助于可变的私有化和范围界定。 这是一般的JavaScript。 对于jQuery,我只是使用API。 另外在javascript上的Yui Theatrevideo相当不错
JavaScript可能有点棘手,它的一些function方面混淆了人。 如果你真正学习和理解语言,你会发现它非常有用,大多数人只是随机开始使用它,然后只是讨厌。
阅读javascript crockford的好作品,这真的很有帮助: http ://javascript.crockford.com/
还要确保你了解closures 。 这是人们不能得到但经常使用的根本。
在variables范围方面,存在局部和全局variables。 在这个例子中可以看到variables作用域的变体之一:
var thisIsAGlobalVariable function anon () { var thisIsALocalVariable thisIsAGlobalVariable = 5; //if you don't use the var prefix inside a fn, it becomes global }
你发现这很困难,因为:
- JavaScript有另一种语法。
- JavaScript是困难的debugging
- JavaScript没有像C#等自动完成?)或做到这一点
- JavaScript有不合逻辑的规则(一旦与他们相识,它们就会变得合乎逻辑)
- 一切都可以用1000种方式完成,当你search一个解决scheme,你会发现2000答案:)其中C#,PHP大多有一个很好的实践function“应该/可以”使用
不过,半年前我开始使用js / jquery,和你一样推理,我坚持下来,现在我每天都用它来增强我的web应用程序。
我只是喜欢它(特别是jQuery)。 这是一种拯救生命,我知道什么和在哪里看,我可以做任何事情。
一切似乎合乎逻辑
如果我能给你一个build议:javascript / jquery是一个酸苹果,但只是挂在那里,有点低谷,你不会后悔的。
另外,一个人使用它loooot,并总是愿意伸出手,如果需要(我知道我是)
Javascript是棘手的。 你没有一个编译器看你的背。 为了弥补,unit testing变得更加重要。 我一直在使用jQuery / QUnit进行unit testing,但是最近我开始使用Jasmine( http://github.com/pivotal/jasmine ),我推荐它使用200%。 它是一个很好的testing框架。
如果您不熟悉testing或使用javascript进行testing,我强烈build议为其他OSS javascript项目(希望您可以使用的代码)查找unit testing并查看testing结果。
通过unit testing,你会犯同样的错误,但更快速地捕捉到他们,并减less悲伤。 如果你的testing是好的,在你修好之后,错误就不会回来。
我不知道你在C中做了多lessUIdevise,但事件variables只有在调用者发送时才显示出来,并且处理程序需要处理该对象。 如果你阅读事件对象,q#2中的混淆应该消失。
PHP中没有事件处理,所以我觉得你以前没有遇到这个问题。 JavaScript是一种具有自己的目的的编程语言,所以它被devise用于这个特定的目的。
也许你必须把你的代码链接到一个HTML onclick="event()"
button才能作为事件触发。