最近在看前段的东西,刚好看到了这一块,觉得可能会有些人在这里有点小疑问,因为我也是带着疑问仔细研究了一下~
首先要说一些js预编译
特点:js在"预编译"阶段, 会解释函数声明, 但却会忽略表式。
匿名函数的创建
第一种方式:
var seu= function(a) { return 23* a; }
上面表达式右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量。
第二种方式:
(function(a, b){
alert(a + b);
})(22, 23);
这里创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。括号是表达式,是表达式就有返回值,所以可以在后面加一对括号让它们执行.
自执行的匿名函数
1. 什么是自执行的匿名函数?
它是指形如这样的函数: (function { code })();
2. 疑问
为什么(function {// code})();可以被执行, 而function {// code}();却会报错?
(1). 首先, 要清楚两者的区别:
(function {// code})是表达式, function {// code}是函数声明.
(2). 当js执行到function() {//code}();时, 由于function() {//code}在"预编译"阶段已经被解释过, js会跳过function(){//code}, 试图去执行();, 故会报错;
当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.
所以我们要做的就是把函数转换为表达式‘’‘’‘’
函数转换为表达式
我们知道,在js中将函数声明表达式转换为函数表达式,只需要在函数声明前面加上 +,-,=,~ 或 ! 等运算符或者()抱起来就行了。
另外,也可以用void操作符进行转换,举个简单的例子:
void function(){console.log(1)}(); //1 void function(g){console.log(g)}(this); //window
void在项目开发中还有两个比较常用的地方:
1.通过 void 0;取到真正的undefined
2.将a元素的href属性设置成javascript:void 0;来阻止页面跳转。