为什么我发现Javascript / jQuery如此难以正确?

Why am I finding Javascript/jQuery so difficult to get right?

我的背景是C语言,我学过php、mysql、html、css,没有太多问题。

但我发现javascript/jquery很难纠正。非常令人沮丧。为什么?

  • 它似乎违反了一些传统的编程原则(例如变量范围)

  • 未定义的变量似乎不知从何处出现,并且已经有了与它们相关联的值。例如(来自jquery文档):

    1
    2
    3
    4
    5
    6
    $("a").click(function(event) {
        event.preventDefault();
        $('')
              .append('default ' + event.type + ' prevented')
              .appendTo('#log');
    });

    "事件"到底是什么?我必须使用这个变量名吗?我应该假设这个对象是用正确的东西神奇地实例化的,并且我可以使用jquery api上的任何方法列表吗?

  • 似乎有很多随机规则(例如,返回false以停止默认操作,但有时不起作用?)

  • 调试时的非确定性行为。(例如,我刷新浏览器,尝试一些方法,并获得我在Firebug中观察的JS变量的结果x。我再次刷新,结果是y?)

  • 看起来很凌乱的代码,很难理解。什么时候会发生?我正在使用Firebug和Chrome开发工具,但我的可见性不够。

  • 似乎每天都会有一些随机的JS"规则"出现在我的任何JS书籍或教程中,这是我以前从未见过的。

    我需要做什么才能使javascript/jquery对我更有确定性、控制性和逻辑性?

    有什么资源可以解释javascript的怪癖/gotchas吗?

    谢谢!


    布尔奇1(P)你需要宣布的变量使用的EDOC 0,埃尔斯将进入全球范围。(p)布尔奇1(P)This is possibly related to(1)and/or(4).(p)布尔奇1(P)你需要让手淫者回到你的谎言。E.G.You also need to return from the"main"function,not only from a closure(a function inside a function),referring to your previous question.它只会回到"主要"功能并继续下去。(p)布尔奇1(P)Probably the code was executed before the html dom was finished populating.You need to hook on EDOCX1 penographic 2 or EDOCX1 penographic 3 nable when you never want to execute studff during page load.(p)布尔奇1(P)I bet that you're talking about jquery source?这只是一个大图书馆。你应该在这一切都还没结束的时候Rather worry about your own code.然而,让你知道,你将在未经授权的版本JQERY's Source Code。(p)See also:

    • Javascript:The bad parts
    • What should every Javascript Programmer know


    (P)Douglas Crockford's"Javascript:The Good Parts"was an important resource.Javascript plays a lot more like Lua,Lisp,or Python than C,it just happens to look like C.(p)(P)Link provided to Amazon;I snagged mine from O'Reilly.(p)


    说实话,我认为你理解得很好。我的一些宿醉是相似的。我一直在前进的方式是"好吧,如果是这样,那么就是这样"。只需接受这些特质并向前推进。PHP做了一些相同的事情(变量可能会出现在任何地方,等等…)。只需按照您想要的方式编码,如果它有效,那就太好了!

    然后,在您达到这一点后,开始分解分析器,看看是否有任何可以优化的地方。

    以下是一些事情:

    如果您了解CSS,那么jquery选择器应该很容易。就代码而言,如果您可以处理链接和JSON,这也很简单。编辑:另外,jquery文档中的所有内容都非常好!而且这里也不乏jquery专家,所以我们可以帮助我们的noobs(希望我们能回报对新noobs的青睐)。

    有一个合作的范围。(基本上)任何写在函数或对象之外的东西都在全局范围内。如果您在对象或函数内部并使用var,那么这将设置变量的作用域

    JavaScript不像C语言(甚至C++或PHP)。它使用原型来处理类/对象关系,而不是子类化方案。

    让我陷入困境的是,任何出现在页面上任何地方或包含在标签中的JS都是公平的游戏。如果在一个脚本中有一个全局变量,则可以在完全不同的脚本中使用相同的变量,它将起作用。这可能就是你所说的变量突然出现的意思。此外,还有一些基于DOM的变量也可以"显示"。

    不管怎样,我认为如果你继续前进,你会得到一些"啊哈"的时刻。我对编程是一个相对的笨蛋,但只要我不挂断对实际运行代码没有太大影响的东西,我就会不断成长。


  • (P)这是一种基于原始语言的语言,并且受到功能性方案编制语言和范式的影响,因此不完全符合其他语言。变量是隐含的全球化,没有一个用EDOCX1表示的语言。(p)
  • (P)请包括一个例子?(p)
  • (P)EDOCX1 5 universal exits out of the function as with any language's return statement.EDOCX1 would be the DOM method to cancel the default behaviour of a link(p)
  • (P)Javascript is used primarily on the client side.由于有许多用户的机构,因此这些机构有不同的执行情况,这是非常不一致的,Moreso than JS itself。Again,please include a real example to get a definitive answer.(p)
  • (P)You'll find messay looking code in any language,and may be your lack of understanding perceives the code as messay,when in fact it isn't so bad.Or maybe you're looking at some minified/obfuscated code.(p)
  • (P)i recommend http://eloquentjavascript.net/for learning aspects of Javascript.(p)(P)Things you'll learn from the link above(p)

    • 兰巴达
    • Closures
    • 黄鳍黄鳍鲷
    • 基于事件的程序
    • 德布金斯
    • DOM

    (P)Javascript can be a little tricky and some of it's functional aspects confused people.如果你现在正在学习和理解语言你会发现它是真正的使用,大多数人只是随机开始使用它,他们只是恨你。(p)(P)Read Javascript the Good Parts by Crockford,it's Really Helpful:http://javascript.crockford.com/(p)(P)还可以让你理解关闭。这是一个基本的人不得到但often使用。(p)


    (P)Crockford's"Javascript:the good parts"gives some common JS patterns that help with variable privatization and scoping.This is for Javascript in general.对于JQERY我只是使用投资政策评审。also the yui theatre videos on Javascript are quite good(p)


    (P)"Javascript:The Good Parts"by Douglas Crockford is a good start(p)(P)In your case,the Appendices("The bad parts"and"the awful parts")may be the most interesting:(p)


    我不知道您在C语言中做了多少UI设计,但是事件变量只在调用方发送时显示,处理程序需要处理对象。如果你阅读事件对象,那么q 2中的混乱应该会消失。

    PHP中没有事件处理,所以我认为您过去没有遇到过这个问题。JavaScript是一种有其自身目的的编程语言,因此它是为特定目的而设计的。


    JavaScript很棘手。你没有一个编译器在监视你。为了补偿,单元测试变得更加重要。我一直在用jquery/qunit进行单元测试,但最近我开始使用jasmine(http://github.com/pivotal/jasmine),我推荐它200%。它是一个很好的测试框架。

    如果您不熟悉测试或者使用javascript测试,我强烈建议您为其他OSS javascript项目查找单元测试(希望您可以使用代码),并了解它们如何测试。

    有了单元测试,你也会犯同样的错误,但你会更快地抓住它们,并且不会那么痛苦。如果你的测试是好的,错误不会在你修复后回来。


    你发现这很困难,因为:

    • javascript有另一种语法。
    • javascript很难调试
    • javascript没有像c等自动完成功能?还是这样
    • javascript有不合逻辑的规则(一旦你知道它们,它们就变得合乎逻辑)
    • 一切都可以用1000种方法完成,当你搜索一个解决方案时,你会找到2000个答案:)在C中,PHP主要有一个好的实践功能u"应该/可以"使用

    然而,我在半年前就开始使用JS/jQuery,理由和你一样,我坚持使用它,现在我每天都使用它来增强我的webapps。

    我就是喜欢它(特别是jquery)。它是一个救命稻草,我知道该找什么,在哪里,我可以用它做任何事情。

    一切似乎都合乎逻辑。

    如果我能给你一个建议:javascript/jquery是一个酸苹果,但只要坚持下去,一点点低谷,你就不会后悔了。

    而且,很多人都会使用它,如果需要的话,他们总是愿意伸出援手(我知道我会这样做)。


    (P)在变量范围内,有局部和全球变量。1 of the gotchyas of variable scope can be seen in this example:(p)字母名称


    也许您需要将您的代码链接到一个html onclick="event()"按钮,以便作为事件触发。