逗号运算符
先说一个学到的小知识点,那便是逗号运算符。逗号运算符,如果在括号中有多个值,用逗号分隔,那只会执行最后那个。具体如下:
var a = (1,3,'fe',6)
console.log(a);//6
var a = (1,3,'fe')
console.log(a);// fe
然后便是今天的重点,立即执行函数(IIFE)。
执行函数(IIFE)
执行函数有多种写法,大致分为三种。立即执行函数,IIFE 立即执行一次然后销毁 一定是表达式才能被执行符号执行。
(function () {
console.log(1);
})(); //打印1
var test1 = function (a) {
console.log(2);
}
test1();//打印2
+ function test2() {
console.log(3);
}();//如果没有前面的加号那只是函数声明,报语法错误
//函数声明变成表达式的方法 + - ! || &&
function test3(a){
console.log(4);
}(6)//不报错,但无输出,而且括号不写6,不传值,就报错了
第二种:
//第二种
(function () {
console.log(666);
}()) //输出666,w3c建议写法
第三种,重点,开发常用
//第三种,重点,开发常用
function test() {
var arr = [];
var i = 0
for (; i < 10;) {
arr[i] = function () {
document.write(i+" ");
}
i++
}
console.log(arr);
return arr;
}
var myArr = test();
for (var j = 0; j < 10; j++) {
myArr[j]();
}
猜猜结果是怎样的?
分析一下: test函数执行返回数组arr,并赋给myArr。arr原来为空,但循环了十次,而且每一项都是一个匿名函数function。所有打印arr的结果就是输出一个有十个元素都为function的数组。后面的for循环显然是执行这十个function。 而且上一个循环结束的下一步就是返回,上个循环结束时i=10;因为arr是return出来的,形成了闭包,保存了test的AO,AO里面有i=10。所以document.write(i)的结果是10,最后屏幕上显示10个10。
看看这个题
var a = 10;
if(function b(){}){
a += typeof(b)
}
console.log(a);
结果是10undefined 为什么呢? function b (){} 显然为真,因为不是错误的五种类型如:undefined,null,false,"",{},所以会继续执行下去,那b是什么呢。关键点在于(function b(){}),加了括号就是表达式,里面是函数声明,有没有b都一样,所以b是undefined.