每天学习新的东西可以让一个理性的人走上不平凡的道路。作为开发人员,不断学习新事物是我们工作的一部分,不管这些新事物是否来自积极的学习经验。
在本教程中,我将指出一些重要的JavaScript最佳实践,这样您就不必以另一种困难的方式理解它们。准备升级您的代码!
假设您有一个包含脚本标记的HTML文件,并且这个标记包含(或通过引用JavaScript文件加载)以下内容:
var foo=42console . log(foo);这段代码显然导致控制台输出42。但是,因为代码不是在函数中执行的,所以它的执行上下文将是全局的。因此,变量被附加到窗口对象。这意味着window.foo的值也将是42。
这非常危险,因为您可以通过:覆盖现有的全局变量
函数print () { //做点什么} print();当执行window.print(或只执行print)时,它不会打开打印弹出窗口,因为我们已经覆盖了原始打印弹出逻辑。
这个问题的解决方法相当简单;我们需要一个在定义后立即调用的闭包函数,如下面的:所示
//声明匿名函数(function(){ var foo=42;console . log(window . foo);//未定义的console . log(foo);// 42})();//并立即调用它,或者您可以选择将window和其他全局内容(如document)作为参数传递给该函数(这也可能提高性能):
(函数(全局,文档){ global.setTimeout(函数(){ doc.body.innerHTML='Hello!';}, 1000);})(窗口、文档);所以你必须使用闭包函数来避免创建一些全局的东西。请注意,因为我想关注代码本身,所以我不会在下面的代码片段中使用闭包函数。
Prompt :browserify是避免创建全局变量的另一种方法。它使用了您也将在Node.js中使用的require函数
顺便说一下,Node.js会自动将你的文件封装成函数。他们首先看起来像这样,
(函数(导出,要求,模块,_ _文件名,_ _目录名){//.因此,如果你认为require函数是全局的,那么,它不是。它只不过是一个函数的参数。
Window.window.window//=窗口.}这是一个窗口对象和一个循环引用对象。下面展示了如何创建这样一个对象:
//创建objectvar foo={ };//将键值指向对象本身foo . bar=foo;//这个‘foo’对象刚好变成一个圆形的one:foo.bar.bar.bar.bar//foo或者,为了表示你对JavaScript的无限热爱,你可以做一个发烧友,代码如下:
是的,您可以几乎无休止地扩展这个对象(或者等到浏览器崩溃)。
例如:
//this bad,因为youdoreceateglobalwithowavinganyonetotellyou(function(){ a=42;console . log(a);//42})();console . log(a);//42使用严格使用,您可以获得更多错误消息:
(function(){ ' use strict ';a=42//error : unanchoriterceerror : aisnotdefined })();你可能想知道为什么可以在封闭函数之外使用strict。这是可以的,但之后它将适用于整个世界。还不算太坏,但是如果有其他库的代码,或者想把所有东西都打包在一个文件里,就会有影响。
42 '==42/true由于一些明显的原因(如验证操作),最好使用严格等于(===):
42 '===42//假
exprdosomehing();//insteadof : if(expr){ dosometing();}如果需要通过dosometing():来决定返回的结果,那么会更冷:
functiondosometing(){ return { foo : ' bar ' };} varexpr=truevarres=exprdosomesing();rescon sole . log(RES);//{foo:'bar'}在这方面你可能不同意我的看法,但正如我所说,效果其实更好。如果你不想这样混淆你的代码,这就是JavaScript reducers实际做的。
如果你问我,我会说它使代码变短了,但它仍然可读。
//fromany hing to numbervarfoo=' 42 ';varmyNumber=foo//shortcutfor number(foo)/42//tip : youcanconvertiddirectly intanegativenumbervarnergativefoo=-foo;//或-Number(foo)/-42//Fromobjecttoarray//Tip : ` arguments ` is objectandgeneraliyouwantouseitasarrayvarargs={ 0: ' foo ',1:'bar ',length :2 };array . prototype . slice . call(args)/[' foo ',' bar ']//any hingtoboolean///nonnonnononisabooleanpart=1;varf=0;t//真!f//false///And non-pisabooleanon-p!t//假!f//true//any thingtostringvarfoo=42;' foo//shortcutforsting(foo)/' 42 ' foo={ hello : ' world ' };JSON . stringify(foo);//' { hello ' : ' world ' } ' JSON . stringify(foo,null,4);//beauty things////' {//' hello ' : ' world '///} '//noteyoucantjson . stringifycroundstructurejson . stringify(window);//type error : JSON . stringifyannotserializechyclicstructures .
一些现有的不同代码样式如下:
谷歌JavaScript风格指南
airbnb/javascript
.还有一些人。
我的风格指南
美化你的代码
UglifyJS(2):混淆/最小化您的代码
Jshint:检测JavaScript代码中的错误或潜在问题
Jscs:可配置样式指南检测器
最后一个是:不要总是使用控制台。记录调试代码。
祝你编程愉快!
原地址:https://www . code mentor . io/Johnny b/tutorials/JavaScript-最佳实践-du107mvud