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

JMa*_*Man 48 javascript jquery

我的背景是在C中,我已经选择了PHP,mySQL,HTML,CSS而没有太多问题.

但我发现Javascript/jQuery难以正确使用.很沮丧.为什么?

  1. 它似乎违反了许多传统的编程原则(例如可变范围)

  2. 未定义的变量似乎无处不在,并且已经存在与它们相关联的值.例如(来自jQuery文档):

    $("a").click(function(event) {
        event.preventDefault();
        $('<div/>')
              .append('default ' + event.type + ' prevented')
              .appendTo('#log');
    });
    
    Run Code Online (Sandbox Code Playgroud)

    什么是"事件"?我必须使用此变量名称吗?我应该假设这个对象是用正确的东西神奇地实例化的,我可以使用JQuery API中的任何方法列表吗?

  3. 似乎有一堆随机规则(例如,返回false以停止默认操作,但有时这不起作用?)

  4. 调试时的非确定性行为.(例如,我刷新浏览器,尝试一些东西并获取结果X用于我在Firebug中观看的JS变量.我再次刷新,我得到结果Y?)

  5. 非常混乱的代码很难遵循.什么时候发生?我正在使用Firebug和Chrome开发者工具,但我没有获得足够的可见度.

似乎每天都有一些随机的JS"规则"出现在我的任何JS书籍或教程中我从未见过.

我需要做些什么才能使Javascript/jQuery对我更具确定性,控制性和逻辑性?

有没有资源可以解释Javascript的怪癖/陷阱?

谢谢!

Bal*_*usC 12

1)它似乎违反了许多传统的编程原则(例如可变范围)

您需要使用声明变量var,否则它将进入全局范围.

2)未定义的变量似乎无处不在,并且已经存在与它们相关的值(这是怎么发生的?)

这可能与1)和/或4)有关.

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

您还需要让处理程序返回false.例如form onsubmit="return functionname()".您还需要从"main"函数返回,而不仅仅是从闭包(函数内部的函数)返回,参考您之前的问题.它只会返回"主要"功能并继续.

4)调试时的非确定性行为.(例如,我刷新浏览器,尝试一些东西并获取结果X用于我在Firebug中观看的JS变量.我再次刷新,我得到结果Y?)

可能代码是在HTML DOM完成填充之前执行的.您需要挂钩window.onload$(document).ready()在页面加载期间执行任何操作.

5)非常混乱的代码很难遵循.什么时候发生?我正在使用Firebug和Chrome开发者工具,但我没有获得足够的可见度.

我打赌你在谈论jQuery源码?这只是一个大型图书馆.你应该在调试时不用担心这个问题.而是担心自己的代码.但是,请确保您正在查看jQuery源代码的未分析版本.


也可以看看:


Bro*_*oam 10

Douglas Crockford的" Javascript:The Good Parts "是一个非常宝贵的资源.Javascript比C更像Lua,Lisp或Python,它恰好像C一样发生.

链接提供给亚马逊; 我从奥莱利那里抓住了我的.

  • +1 - http://www.youtube.com/watch?v=hQVTIJBZook&playnext=1&videos=kJDqi1_HnXk (2认同)
  • @Crescent我认为SO会自动将亚马逊链接转换为他们的参考.码.对他们有好处. (2认同)

TCC*_*CCV 6

说实话,我觉得你有很好的理解.我的一些挂机很相似.我一直在继续前进的方式是"好吧,如果就是这样,那就是它的方式".只需接受特质并向前推进.PHP做了一些相同的事情(变量可以突然出现,等等......).只需编码您想要编码的方式,如果它有效,那就太好了!

然后,在你到达那一点之后,开始打开分析器并查看是否有任何可以优化的东西.

这里有几件事:

如果您了解CSS,那么jQuery选择器应该很容易.就代码而言,如果你能处理链接和JSON ,这也很简单.编辑:此外,关于一切的jQuery文档是优秀的!并且这里不乏jQuery专家来帮助我们新手(并且希望我们可以回报新的新手的青睐).

有一个范围可以使用.(基本上)在函数或对象之外编写的任何内容都在全局范围内.如果您在对象或函数内部并使用,var则设置变量的范围

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

让我循环的第一件事是,任何出现在页面上任何位置或包含在<script>标签中的JS 都是公平的游戏.如果在一个脚本中有一个全局变量,则可以在完全不同的脚本中使用该变量,它将起作用.这可能就是你无处不在的变量的意思.此外,还有一些基于DOM的变量也可以"显示".

无论如何,我认为如果你只是向前推进,你会得到一些"AHA"时刻.我是一个相对编程的小伙伴,但只要我不挂起对实际使代码运行没有太大影响的东西,我就会不断成长.