资讯专栏INFORMATION COLUMN

JavaScript匿名函数以及在循环中的匿名函数

dreamtecher / 1893人阅读

摘要:这里留下一个问题,如果写成这样,你觉得可以么总之,真是一门奇异的语言

一 历史

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

这里i会是最大值,为何呢?因为这是一个异步函数,而非同步立即返回的函数,此时由于js奇怪的单线程机制,会待同步全部结束后再运行异步的代码,所以i始终是最大值,那么要用什么方法解决呢?是的,加一个闭包。

这里留下一个问题,如果写成这样,你觉得可以么

for(var i=0;i

总之,js真是一门奇异的语言

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83706.html

相关文章

  • 深入javascript——作用域和闭包

    摘要:注意由于闭包会额外的附带函数的作用域内部匿名函数携带外部函数的作用域,因此,闭包会比其它函数多占用些内存空间,过度的使用可能会导致内存占用的增加。 作用域和作用域链是javascript中非常重要的特性,对于他们的理解直接关系到对于整个javascript体系的理解,而闭包又是对作用域的延伸,也是在实际开发中经常使用的一个特性,实际上,不仅仅是javascript,在很多语言中都...

    oogh 评论0 收藏0
  • JavaScript中的闭包

    摘要:权威指南第版中闭包的定义函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中成为闭包。循环中的闭包使用闭包时一种常见的错误情况是循环中的闭包,很多初学者都遇到了这个问题。 闭包简介 闭包是JavaScript的重要特性,那么什么是闭包? 《JavaScript高级程序设计(第3版)》中闭包的定义: 闭包就是指有权访问另一个函数中的变...

    Donne 评论0 收藏0
  • 深入理解闭包的概念

    摘要:离开闭包的泥淖,给这个例子一个较为合理的写法总结理解闭包的概念是重要的,但我们不应当过多的使用闭包,它有优点,也优缺点,是一把双刃剑。 闭包 关于闭包,目前有如下说法: 闭包是函数和声明该函数的词法环境的组合(MDN) 函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内。这种特性在计算机科学文献中被称为闭包(JavaScript权威指南) 闭包,指的是词...

    anyway 评论0 收藏0
  • 简述Function类型

    摘要:类型是提供的引用类型之一,通过可需变更创建对象。调用自身的函数被称之为递归函数。想要解决上述递归函数的问题,可以使用对象属性替换具体的函数名。保护贡献的局部变量。 Function类型 概述 Function与函数 函数是这样的一段JavaScript代码,她只定义一次,但是可能被执行或调用多次。Function类型是JavaScript提供的引用类型之一,通过Function可u需变...

    ityouknow 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<