七个最有用的JavaScript技巧( 四 )


5.) 命名vs匿名函数基于我们刚才的讨论,你可能一进猜到“匿名”函数其实就是一个没有名字的函数 。大多数JavaScript开发者能迅速识别瞎买年第一个参数为匿名函数:
someElement.addEventListener("click", function(e) {// I'm anonymous!});然而,同样的我们的marty.timeTravvel方法也是一个匿名函数:
var marty = {firstName: "Marty",lastName: "McFly",timeTravel: function(year) {console.log(this.firstName + " " + this.lastName + " is time traveling to " + year);}}因为函数声明必须有一个唯一的名字,只有函数表达式可以没有名字 。
6.) 立即执行函数表达式因为我们正在谈论函数表达式,有一个东西我希望我早知道:立即执行函数表达式(IIFE) 。有很多关于IIFE的好文章(我将在文章结尾出列出),但用一句话来形容,函数表达式不是通过将函数表达式赋值给一个标量,稍后再执行,而是理解执行 。可以在浏览器控制台看这一过程 。
首先——让我们先敲入一个函数表达式——但不给它指派变量——看看会发什么:

七个最有用的JavaScript技巧

文章插图
 
语法错误——这被认为是函数声明,缺少函数名字 。然而,为了使其变为表达式,我们仅需将其包裹在括号内:
七个最有用的JavaScript技巧

文章插图
 
让其变为表达式后控制台返回给我们一个匿名函数(记住,我们没有为其指派值,但表达式会有返回值) 。所以——我们知道“函数表达式”是“立即调用函数表达式”的一部分 。为了等到“立即执行”的特性,我们通过在表达式后面添加另一个括号来调用返回的表达式(就像我们调用其他函数一样):
七个最有用的JavaScript技巧

文章插图
 
“但是等一下,Jim!(指作者)我想我以前见过这种调用方式” 。事实上你可能见过——这是合法的语法(众所周知的是Douglas Crockford的首选语法)
七个最有用的JavaScript技巧

文章插图
 
这两种方法都起作用,但是我强烈建议你读一读这里 。
OK,非常棒——现在我们已经知道了IIFE是什么——以及为什么要用它?
它帮助我们控制作用域——任何JavaScript教程中非常重要的部分!前面我们看到的许多实例都创建在全局作用域 。这意味着window(假设环境是浏览器)对象将有很多属性 。如果我们全部按照这种方式写我们的JavaScript代码,我们会迅速在全局作用域积累一吨(夸张)变量声明,window代码会被污染 。即使在最好的情况下,在全局变量暴漏许多细节是糟糕的建议,但当变量的名字和已经存在的window属性名字相同时会发生什么呢?window属性会被重写!
【七个最有用的JavaScript技巧】例如,如果你最喜欢的“Amelia Earhart”网站在全局作用域声明了一个navigator变量,下面是设置之前和之后的结果:
七个最有用的JavaScript技巧

文章插图
 
哎呀!
显而易见——全局变量被污染是糟糕的 。JavaScript使用函数作用域(而不是块作用域,如果你来自C#或Java,这点非常重要!),所以保持我们的代码和全局作用域分离的办法是创建一个新作用域,我们可以使用IIFE来实现,因为它的内容在它自己的函数作用域内 。在下面的例子中,我将在控制台向你显示window.navigator的值,然后我常见一个IIFE(立即执行函数表达式)去包裹Amelia Earhart的行为和数据 。IIFE结束后返回一个作为我们的“程序命名空间”的对象 。我在IIFE内声明的navigator变量将不会重写window.navigator的值 。
七个最有用的JavaScript技巧

文章插图
 
作为额外好处,我们上面创建的IIFE是JavaScript中模块模式的启蒙 。我将在结尾处包括一些我浏览的模块模式的链接 。
7.) ‘typeof’操作符和’Object.prototype.toString’最终,可能发现在某些情况下,你需要检查传递给函数参数的类型,或其他类似的东西 。typeof运算符会是显而易见的选择,但是,这并不是万能的 。例如,当我们对一个对象,数组,字符串或正则表达式,调用typeof运算符时会发生什么?


推荐阅读