你应该知道的6个高级JavaScript概念

WebFX总统。Bill在互联网营销行业有超过25年的经验,专门从事SEO, UX,信息架构,营销自动化等。William在Shippensburg和MIT的科学计算和教育背景为cloudfx和WebFX的其他关键研究和开发项目的营销提供了基础。

你应该知道的6个高级JavaScript技术

在过去的几年里,已经有很多文章讨论了JavaScript的最佳实践技术。我想我应该稍微超出这些文章的范围,概述一些我个人使用过或读到过的高级JavaScript概念和技术,这些概念和技术在某些情况下可能非常有用。

本文不一定涵盖我所描述的方法的每个细节,但提供了概述,以及带有代码的高级JavaScript示例。

1.扩展变量范围的闭包

JavaScript中的闭包是一个相当简单的概念,已经在许多深入的文章中进行了在线讨论。事实是,它们是直接的并不一定意味着它们是简单的,然而,从广泛的文章,涵盖了这个主题。

简单地说,闭包允许变量作用域扩展到函数的通用作用域限制之外。我喜欢Jeremy Keith在他的书中对闭包的描述防弹Ajax

“可以将关闭门店视为一种区域范围:比本地范围更广,但不像全球范围那么广。”

要创建关闭,请嵌套功能内的函数。内部功能可以访问其父函数范围内的所有变量。在面向对象脚本中创建方法和属性时,这会派上友好。以下是一个简单的示例,演示了使用闭包:

函数myObject() {this。property1 =“value1”;这一点。property2 = value2”;var newValue = this.property1;这一点。performMethod = function() {myMethodValue = newValue;返回myMethodValue;};} var myObjectInstance = new myObject();警报(MyObjectInstance.performMethod());

脚本的关键部分是嵌套的匿名函数(以绿色突出显示)和方法调用警报函数(最后一行)。因为alert中的方法实际上调用了一个嵌套函数,所以该方法能够读取所调用变量的值newValue甚至认为变量不在匿名功能的范围内或方法。

开发人员一直在使用闭包,可能在不知情的情况下,因为当匿名函数嵌套在另一个函数中并利用父函数作用域的变量时,就会创建闭包。闭包的强大功能是在调用该方法(内部函数)时显示出来的,通常不能访问的值在“区域”范围内,因此可以作为任何其他值使用。

请参阅下面的参考文献,了解对关闭的一些更深层次的解释及其与范围的关系。我也强烈建议您拿起一个很好的高级JavaScript书,并讨论了与闭包相关的概念。

进一步阅读

  • 解释JavaScript范围和闭包(罗伯特·尼曼)
  • JavaScript闭包(James Padolsey)
  • Jibbering.com的JavasCript闭包
  • 用于傻瓜的JavaScript闭包

2.传递可选参数的对象字面值

在处理可以接受大量可选参数的函数时,这里有一个方便的编码技巧要记住。与传统方式传递大量参数(这会不必要地使函数复杂化)不同,您可以只传递一个参数,该参数最终是在对象字面量中声明的参数集合。

首先,让我们看看我们如何以典型的方式来做这件事,这样我们就可以看到对比:

function showStatistics(name, team, position, average,全垒打,rbi){文件。写(“< p > < >强名称:< / >强”+参数[0]+ < br / >);文档。写(“< >强团队:< / >强”+参数[1]+ < br / >);If (typeof arguments[2] === "string"){文档。写(“< >强位置:< / >强”+位置+ < br / >);} if (typeof arguments[3] === "number"){文档。write("击球平均: " + Average + "
");} if (typeof arguments[4] === "number"){文档。写("全垒打: " +全垒打+ "
");} if (typeof arguments[5] === "number"){文档。write("Runs Batted In: " + rbi + "

"); } } showStatistics("Mark Teixeira"); showStatistics("Mark Teixeira", "New York Yankees"); showStatistics("Mark Teixeira", "New York Yankees", "1st Base", .284, 32, 101);

上面的函数最多可以接受6个参数。前两个参数是强制性的,因此在函数内部,我们不检查它们是否存在。最后4个参数不是强制的,所以我们只在它们存在的情况下显示它们的值。

我们调用函数3次(最后3行),每次参数的数量不同。您可以看到,如果传递的参数的数量是几十个,或者更多,那么代码看起来会有点混乱,并且会更难维护或阅读。

现在让我们看一下使用对象字面量来传递参数的相同代码:

函数Showstatistics(args){文档。写(“< p > < >强名称:< / >强”+ args.name + < br / >);document.write(“团队:”+ args.team +“
”);if(typeof args.position ===“string”){document.write(“位置:”+ args.position +“
”);}如果(typeof args.average ===“数字”){document.write(“平均:”+ args.average +“
”);}如果(typeof args.homeruns ===“number”){document.write(“ home运行:”+ args.homeruns +“
”);}如果(typeof args.rbi === =“number”){document.write(“运行击球:”+ args.rbi +“”);} }showStatistics({名称:“Mark Teixeira”});showStatistics(名字:“Mark Teixeira”,球队:“纽约扬基队”);showStatistics({名称:“Mark Teixeira”,球队:“New York Yankees”,位置:“一垒”,平均成绩:0.284,全垒打:32,打点:101});

从技术上讲,这种传递参数的第二种方法可能需要更多的代码,但是有很大的参数集合,有一些优点。

首先,函数本身被简化了,因为它只接受一个参数(arg游戏),它是从对象字面量(姓名团队位置等等)。另外,实际的参数值很容易阅读,也很容易理解、更新或修改,因为值和参数引用之间的相关性更直接。

如果函数只需要少量的参数,那么这个方法就不需要了,实际上可能会产生相反的效果。因此,要谨慎地使用这种技术,并且只在您预见到随着时间的推移,参数集合很难维护的情况下使用。

进一步阅读

3. DOM元素的上下文目标

有时,您需要遍历DOM并获得对特定元素或元素组的访问权,但由于某些限制,您可能无法通过HTML代码中的CSS类名或ID直接访问这些元素。这可能是因为用户通过富文本编辑器生成的内容,或者是从数据库中提取的动态内容。

无论如何,通过JavaScript访问这些未识别的DOM元素并非不可能。使用我所说的“上下文定位”,您可以访问和修改几乎DOM中的任何元素。只要您有包含您想要锁定的元素的通用模板的映射,您就可以像访问具有类名或ID的元素一样访问并操作该元素。

让我们创建一些基本的HTML代码,作为我们的示例页面:

< div id = "头" > < h1 >网站标题< / h1 > < / div > < div id =“侧边栏”> < ul > <李> < a href = " # " >测试< / > < /李> <李> < a href = " # " >测试< / > < /李> <李> < a href = " # " >测试< / > < /李> <李> < a href = " # " >测试< / > < /李> <李> < a href = " # " >测试< / > < /李> <李> < a href = " # " >测试< / > < /李> < / ul > < / div > < div id =“内容”> < h2 >页面标题< / h2 > < p > < a href = " # " > Lorum添加链接here. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.

使用上面的HTML代码,如果我们想要瞄准页面上的所有锚标记,我们可以收集它们并像这样操作它们:

var mylinkcollection =文档。getElementsByTagName(“”);for (i=0;i
            

但是,如果我们想要仅瞄准页脚中的锚标签,我们将根据其上下文或周围元素来定位它们,如下所示:

var myfooterelement =文件.getElementByID(“页脚”);var mylinksinfooter = myfooterelement.getElementsByTagName(“”);for(i = 0; i 
            

第一线抓住对页脚元件的引用。第二条线收集所有<一>页脚内的标签。然后我们循环使用它们,并对它们做我们想做的事情。因此,即使它们不是通过类名分组的,也可以访问它们。

您可以通过使用节点属性完成相同的任务,如下所示。

var mylinkcollection =文档。getElementsByTagName(“”);for (i=0;imyLinkCollection[我].parentNode.parentNode.id=== "footer"){//在这里使用footer锚标记}}

类似的代码也可以用于“content”部分中的锚标记。

我们还可以将锚标记搜索限制为只包含具有HREF.属性集,以避免找到任何页内链接。我们用getAttribute方法:

var mylinkcollection = document.getElementsByTagname(“A”);for(i = 0; i getAttribute(“href”)){//对这里的锚标记做点什么}}

最后,你会注意到有一个< span >内联样式的标签。内联样式可能是通过内容管理系统生成的,因此您可能无法直接编辑它。你可以针对所有< span >元素的内联样式如下:

var mylinkcollection =文档。getElementsByTagName(“跨度”);for (i=0;i
            

上下文定位的可能性是无穷无尽的,如果您使用的是规范化浏览器差异并简化DOM操作的JavaScript库,那么还有更多可用的选项。

进一步阅读:

4.使用名称空间防止冲突

如果您正在进行广泛的原始JavaScript编码和可疑,可以将添加到您正在进行的页面上的添加,通过为代码提供自己的命名空间,您可以防止与您的代码的任何未来冲突。

面向对象的JavaScript实现了类名称空间的原则,因为属性和方法是在对象内部声明的,因此不太可能发生冲突。然而,通过对象名称可能会产生冲突。而且很有可能,冲突会“悄无声息”地发生,因此您可能不会立即得到这个问题的警告。

您可以通过创建一个唯一的名称空间来避免所有冲突。让我们使用showStatistics函数来演示如何将代码封装到它自己的命名空间中:

if(typeof my ==“未定义”){my = new对象();my.custom = new object();} my.custom.namespace =函数(){function showstatistics(args){document.write(“

name:”+ args.name +
“);document.write(“团队:”+ args.team +“
”);if(typeof args.position ===“string”){document.write(“位置:”+ args.position +“
”);}如果(typeof args.average ===“数字”){document.write(“平均:”+ args.average +“
”);}如果(typeof args.homeruns ===“number”){document.write(“ home运行:”+ args.homeruns +“
”);}如果(typeof args.rbi === =“number”){document.write(“运行击球:”+ args.rbi +“”);Showstatistics({名:“Mark Teixeira”,团队:“纽约洋基队”,位置:“第一基地”,平均:.284,Homeruns:32,RBI:101});my.custom.namespace();

前几行创建名称空间的方法是检查“我的对象已经存在。这个对象可以是任何你想要的。选一个你认为不会再被使用的名字。后我的对象是创建的,然后我们能够创建“自定义“对象作为属性我的对象。那么我们的名称空间函数变成了方法我的。自定义对象。请记住这一点”我的”、“自定义”和“名称空间可以是你自己的名字。我选择这些是为了演示。他们可能会CHEESEBURGER.ONIONS.pickles如果你想要!

showStatistics函数与前面的示例完全相同,它利用对象字面量来传递值。但在本例中,整个函数(包括对象字面量)都被封装在其中my.custom.namespace.最后一行使用点表示法调用整个函数,函数运行与正常情况下完全一样,除了它被保护免于与另一个名为“showStatistics”。

进一步阅读:

5.混合应用程序开发

如果结合使用JavaScript库和原始JavaScript代码,就可以创建功能强大的JavaScript应用程序。许多JavaScript库被用来实现“漂亮的”动画和其他可定制的效果——有时是通过插件——通常不需要添加太多的东西,除了一些定制值。

另一方面,您可能希望您想要完成客户端特定要求的内容的情况。也许它在图书馆中不可用,这需要广泛的编码,可能利用Ajax和各种DOM方法。

重新发明轮子是没有意义的。您可以实现您喜欢的JavaScript库,并利用其简化的Ajax调用、DOM方法和浏览器差异的规范化。因此,在创建特定于项目的自定义脚本的同时,您可以利用库的优势。

进一步阅读:

6.渲染可读的HTML

最后,在需要通过JavaScript动态生成几十行HTML代码的情况下,可以使用这种技术。举个例子:

var pageContainer = document.getElementById("容器");var pageTitle = "内容标题";var authorBio = " Lorum Ipsum先生";var pagcontent = "Lorum ipsum line text here. "Lorum ipsum line text在这里。Lorum ipsum line text在这里。Lorum ipsum line text在这里。Lorum ipsum line text在这里。Lorum ipsum line text在这里。Lorum ipsum line text在这里。 Lorum ipsum line text here. Lorum ipsum line text here."; var footerContent = "Copyright 2009"; var HTMLCode = '\n

' + pageTitle + '

\n
\n

' + pageContent + '

\n
\n

' + authorBio +'

\n
\n
\n \n'; pageContainer.innerHTML = HTMLCode;

注意上面的线是声明HTMLCode变量的值的线。它渲染只在生成的源代码中找到,因为它使用了“新行”字符,因此它看起来非常好的HTML。但是,如果这一行代码更长,则在.js文件中读取和维护是极难的。

下面是与上面相同的代码,但是实现了一个更有组织的显示HTML的方法:

var pageContainer = document.getElementById("容器");var pageTitle = "内容标题";var authorBio = " Lorum Ipsum先生";var pagcontent = "Lorum ipsum line text here. "Lorum ipsum line text在这里。Lorum ipsum line text在这里。Lorum ipsum line text在这里。Lorum ipsum line text在这里。Lorum ipsum line text在这里。Lorum ipsum line text在这里。 Lorum ipsum line text here. Lorum ipsum line text here."; var HTMLCode = '\n' + '

' + pageTitle + '

\n' '
\n' + '

' + pageContent + '

\n' + '
\n' + '

' + authorBio + '

\n' + '
\n' '
\n' + '\n'; pageContainer.innerHTML = HTMLCode;

现在代码可读性强多了,并且符合HTML在实际HTML页面中呈现的方式。它甚至包括适当的HTML缩进,并且仍然使用新行字符来正确格式化输出的HTML。

结论

虽然我没有详细解释本集合中涉及的每个概念,但我希望这个列表为初级和中级程序员提供了一些相当高级的JavaScript策略的概述,他们可以在未来的项目或实验中实现这些策略。

请随意评论我提到的任何高级JavaScript概念,以及您在自己的应用程序中使用它们的一些具体方法。

相关内容