Answers:
不是jQuery。不是YUI。不是(等)
框架可能很有用,但是它们经常隐藏一些关于JavaScript和DOM实际工作方式的丑陋细节。如果您的目标是能够说“我知道JavaScript”,那么在框架上投入大量时间是相反的。
以下是一些JavaScript语言功能,您应该了解这些功能在做什么并且不会被吸引住,但是对于许多人来说,它们并不是立即显而易见的:
那object.prop
和object['prop']
是同一件事(所以请您停止使用eval
,谢谢);对象属性始终是字符串(即使是数组);什么for
...... in
是(和什么不是)。
嗅探财产;什么undefined
是(以及为什么闻到);为什么看似鲜为人知的in
操作员是有益的并且不同于typeof
/ undefined
检查;hasOwnProperty
; 目的delete
。
该Number
数据类型是一个真正的浮动; 使用浮点数与语言无关的困难;避免parseInt
八进制陷阱。
嵌套函数作用域;在var
您要避免意外的全局范围内使用的必要性;范围如何用于闭包;在闭合回路问题。
全局变量和window
属性如何碰撞;全局变量和文档元素如何在IE中不应该冲突,而应该如何冲突?也必须var
在全球范围内使用以避免这种情况。
function
语句如何在定义之前的代码之前“ 提升 ”定义;函数语句和函数表达式之间的区别;为什么不应该使用命名函数表达式。
构造函数的功能,prototype
属性和new
运算符的工作方式;利用此方法创建您实际想要的普通类/子类/实例系统的方法;当您可能想使用基于闭包的对象而不是原型时。(对此,大多数JS教程材料绝对是可怕的;花了我很多年才把它弄清楚。)
this
通话时如何确定,不受限制;因此,方法传递不像您期望的其他语言那样有效;如何关闭或Function#bind
可以用来解决这个问题。
其他ECMAScript第五版功能indexOf
,forEach
以及上的功能编程方法Array
。如何修复旧版浏览器以确保您可以使用它们;将它们与内联匿名函数表达式一起使用,以获取紧凑,易读的代码。
浏览器和用户代码之间的控制流;同步和异步执行;在控件流内部触发的事件(例如焦点)与控件返回时发生的事件和超时;如何调用所谓的同步内置alert
函数最终会导致潜在的灾难性重入。
跨窗口脚本编写如何影响instanceof
;跨窗口脚本如何影响跨不同文档的控制流;postMessage
希望如何解决这个问题。
有关最后两项,请参阅此答案。
最重要的是,您应该批判性地查看JavaScript,并承认由于历史原因,它是一种不完善的语言(甚至比大多数语言还多),并且避免了最糟糕的麻烦。克罗克福德在这方面的工作绝对值得一读(尽管我并不100%同意他所说的“好零件”)。
this
无论您使用哪种方式绑定它。尝试:var o= {b: function(){alert(this===o);}};
,然后o['b']();
-> true
。而且,如果您真的想要怪异,(o['b'])()
-> true
,但是(c= o['b'])()
-> false
,仅在Mozilla中,(true? o['b'] : null)()
-> true
。W,T,而事实上,F
可以禁用它。
了解Crockford的Javascript:The Good Parts中的内容是一个很好的假设,即一个人是一个不错的JS程序员。
您几乎可以知道如何使用类似JQuery的良好库,而仍然不知道Javascript的隐藏部分。
另一个注意事项是各种浏览器上的调试工具。JS程序员应该知道如何在不同的浏览器中调试其代码。
哦! 而且知道JSLint会完全伤害您的感觉!!
如果您想成为一名真正的JavaScript忍者,则应该了解Perfection Kills JavaScript Quiz中每个问题的答案。
激发食欲的一个例子:
(function f(f){
return typeof f();
})(function(){ return 1; });
此表达式返回什么?
- “数”
- “未定义”
- “功能”
- 错误
如果您不知道,就不会使用JavaScript:
You don't know JavaScript if you don't know The W3C-DOM
。两者是不同的。
..那个javascript不是java :)
很多从网站开发开始的人都告诉我javascript只是简单的Java!
熟悉至少一个Javascript库(Jquery,Prototype等)。
了解如何使用主要浏览器(MSIE 7-8,Firefox,Chrome,Safari)的调试工具
阅读行业:Douglas Crockford的网站是一个宝库,而Ajaxian.com是一个很好的博客,可以跟上Javascript的新的,有趣的或奇怪的想法。还有许多其他资源,但是这些资源对我的帮助最大。
除非声明为局部变量,否则变量是全局变量!
错误(DoSomething()仅被调用10次):
function CountToTen()
{
for(i=0; i< 10; i++)
{
DoSomething(i);
}
}
function countToFive()
{
for(i=0; i<5; i++)
{
CountToTen();
}
}
CountToFive();
良好(DoSomething()被按预期调用了50次):
function CountToTen()
{
var i;
for(i=0; i< 10; i++)
{
DoSomething(i);
}
}
function countToFive()
{
var i;
for(i=0; i<5; i++)
{
CountToTen();
}
}
CountToFive();
for (var i=0;
我所有循环的习惯
var
函数的顶部,因为它不会欺骗您变量范围的大小。js2-mode
如果您var i
在for
同一个函数中的两个单独的循环中会抱怨,因为这表明您认为您有两个单独的变量,而您没有。但是,我确实尝试不要将任何var
事情与初始化它们的地方分开。
因为知道Javascript最初被称为LiveScript,并且为营销目的附加了“ Java”前缀,并不是因为Java和Javascript是相关的(它们没有关联)。
哦,并且拥有David Flanagan的“ Javascript:The Definitive Guide”的任何版本(此信息在第2页上)。
...并感谢那些在试图消除Jquery之类的麻烦之前试图混淆Internet Explorer 4的document.all []和Netscape Navigator 4的document.layers []的人。
编辑:
正如@Kinopiko指出的那样,JavaScript最初被称为Project Mocha(一些消息来源也认为它称为Project LiveWire),但人们普遍认为,该语言(由Brendan Eich编写)计划在采用Java前缀之前以LiveScript的形式发布。在1996年初发行。
应该注意以下几句话:“我知道JavaScript”:
JavaScript与其他语言的差异比您想象的要大得多。观看这场精彩的Google技术讲座,以留下深刻的印象:http : //www.youtube.com/watch?v=hQVTIJBZook
每个JavaScript程序员应该知道什么?
怎么样,我可以通过单击两次关闭您的工作。因此,如有可能,请提供备用。
我强烈建议您阅读Javascript:优秀部分
您知道javascript是否可以有效使用数组,数字,字符串,日期和对象。加上Math和RegExp的分数。您应该能够编写函数并使用变量(在正确的范围内,即作为对象的“方法”)。
我看到一些有关了解闭包,奢侈的函数语法,等等的评论。所有这些与这个问题都没有关系。这就像说如果您可以在11秒内跑完100m短跑,您就是赛跑者。
我说精通javascript可能需要几个星期。之后,要成为专家,忍者等人,需要花费数年时间,数十本书和数千行编程。
但这不是问题。
哦,DOM不是javascript的一部分,jQuery也不是。因此,我认为两者同样与这个问题无关。
JSLint http://www.JSLint.com/
jQuery是我最好的建议。不只是代码本身,最值得模仿的是惯用法,样式和背后的思想。
该javascript是世界上使用最广泛的语言。(大概)
真正的学习语言并理解其各种怪癖来自(多年的)经验。如果您想成为一个更好的程序员,我想说的是,了解设计模式,如何以及何时使用它们,和/或什至在没有意识到的情况下使用它们。技术架构和用户体验。
知道(JavaScript)语言意味着您可以选择任何框架并随意使用。您将不可避免地需要深入研究源代码,并且如果您只知道语法是框架还是2或3,那么您将走得很远。话虽如此,进入几个不同框架的源代码可能是了解如何使用JavaScript的最佳方法之一。逐步解决Firebug或Web Inspector中的代码,然后检查JavaScript文档,尤其是Mozilla和Webkit文档,以进一步了解您正在查看的内容。
了解面向对象编程和函数式编程之间的区别,JavaScript是两者的完美结合,何时以及如何使用它们来创建杀手级代码库和出色的应用程序将使您成为更好的JavaScript程序员。
只需阅读一些书,尤其是Crockford的“好书”,只介绍他对JavaScript的优点的看法,而跳过大部分JavaScript的AWESOME部分将使您误入歧途。
另一方面,查看由Thomas Fuchs之类的人编写的代码,将使您对编写出色而高效的JavaScript的力量有更多的了解。
尝试记住一些陷阱或WTF也无济于事,如果您开始编码并逐步浏览库/框架的代码,特别是在注释中有所帮助的代码,就会发现它们的用处,以了解它们为什么使用了某些属性/值,而不是其他原因,以及为什么以及何时使用特定的操作数和运算符比较好,这一切都在框架的人员使用的代码中。有什么比通过榜样学习更好?:^)
在Javascript中,性能至关重要。
没有智能的编译器可以优化您的代码,因此在编写JavaScript代码时要比C#,Java等语言更加小心。
以下内容也很重要:
1)可变吊装。2)范围链和激活对象。
然后像这样的事情::)
JavaScript不支持使用换行符分隔return关键字和return语句,如以下代码(或在我的jsFiddle页面上尝试)
function foo()
{
return
{
bar: 'something'
};
}
$(function()
{
document.write(foo());
});
我不明白为什么JavaScript不支持这种样式,因为与默认样式的JavaScript相比,读取非常复杂的JavaScript源代码要容易得多。
PS。我已经写了将近6年的JavaScript。但是,当我尝试执行以下功能时,我只是发现了这个错误。它总是返回未定义的。当我使用调试器并进入此功能时,一切正常。我认为这应该是我一生中最糟糕的编程错误。
function JqGridInlineEditor_GenerateTool(cellvalue, options, rowObject, disableEdit, disableDelete)
{
return
(!disableEdit ? '<a class="button edit" href="javascript: void(0);" onclick="JqGridInlineEditor_EditRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Edit.gif'), 'Click here to Edit or \nDouble-click row to edit.') : '') +
(!disableDelete ? '<a class="button delete" href="javascript: void(0);" onclick="JqGridInlineEditor_DeleteRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Delete.png'), 'Click here to Delete or \nSelect row and then press Delete') : '') +
(!disableEdit ? '<a class="button save" style="display:none" href="javascript: void(0);" onclick="JqGridInlineEditor_SaveRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Save.png'), 'Click here to Save or \nPress Enter') : '') +
(!disableEdit ? '<a class="button cancel" style="display:none" href="javascript: void(0);" onclick="JqGridInlineEditor_RestoreRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Cancel.png'), 'Click here to Cancel or \nPress Esc') : '');
}
var foo = "bar" +
)解析器读取时。
var foo = 5
和-1;
将导致foo设置为4,即使它们各自都是有效的语句也是如此。
...关于Google Web Toolkit,这意味着您的javascript项目可能会以更加方便的方式进行开发。