一 汗青
JavaScript实际上是一门奇特的言语,TA的一大特征是没有块级作用域
for(var i=0;i<10;i++){
}
console.log(i)
人人猜想下值是多少?
答案是 10, 虽然我们在一个块内申清楚明了变量,但i倒是在全范围内起作用的,所以就引入了匿名函数
function(){
var i=0;
...
}
以函数的作用域来限制变量作用域
二 马上实行匿名函数
固然,还马上实行的匿名函数
(function(){
do sth.....
})()
第一次看到以为真tm离奇,还tm要如许写,太tm离奇了,我们可以如许看:
定义一个假造变量 var foo = function(){…}
然后foo要实行,所以就
foo() = (function(){
do sth.....
})()
好了,匿名函数就马上实行了
三 循环中的匿名函数
人人看下面一段代码
function foo(){
var arr = [];
for(var i =0;i<5;i++){
arr[i] = function(){
//console.log(i) 来看看什么时刻运转
return i; //定义函数时i的值并没有初始化,指向函数外的i,因而,当匿名函数运转时,这个值就指向最大的i了
}
}
return arr;
}
var a = foo(); //arr的赋值没有被实行
for (var i = 0; i< 5 ;i++){
alert(a[i]());
}
有兴致的无妨运转一下,答案是5个5,发作什么事了呢?
我们在对arr赋值的时刻:
arr[i] = function(){
return i;
}
函数内里的i是没有分派详细的值的,它指向了最外层的i,而运转时才会赋值,所以,它就是最大的5了,再看一个例子
var arr = document.getElementsByTagName("p");
for(var i = 0; i < arr.length;i++){
arr[i].onclick = function(){
alert(i);
}
}
这是一个DOM的onclick事宜,当点击的时想可以弹出差别的i值,实际上是没法完成的,所以,必需运用匿名函数的马上实行来限制作用域
var arr = document.getElementsByTagName("p");
for(var i = 0; i < arr.length;i++){
(function(j){
arr[j].onclick = function(){
alert(j);
}
})(i)
}
四 循环中的异步函数
如许一段代码
for(var i=0;i<n;i++){
ajax(i,function(....)) //这里是一个异步挪用,另有request,http等
}
这里i会是最大值,为什么呢?因为这是一个异步函数,而非同步马上返回的函数,此时因为js新鲜的单线程机制,会待同步悉数完毕后再运转异步的代码,所以i始终是最大值,那末要用什么要领处理呢?是的,加一个闭包。
这里留下一个题目,假如写成如许,你以为可以么
for(var i=0;i<n;i++){
var j={a:i}
ajax(j.a,function(....))
}
总之,js真是一门奇特的言语