美文网首页JS程序员
结合实例浅谈JS回调函数、函数传参及作用域

结合实例浅谈JS回调函数、函数传参及作用域

作者: edisonchan | 来源:发表于2017-08-01 16:06 被阅读0次

分别写出for循环的打印值

for(var i=0;i<5;i++){

   console.log(i)

}

for(var i=0;i<5;i++){

    (function(i){

        console.log(i)

        })(i)

}

for(var i=0;i<5;i++){

    (function(){

        console.log(i)

    })(i)

}

for(var i=0;i<5;i++){

    setTimeout(function(){

        console.log(i)

    },i)

}

//01234

//01234

//01234

//55555

当我运行出结果的时候我第一瞬间没有反应过来,为啥最后一个的输出是//55555

脑袋一转从结果出发,明白了!!!

出现55555的原因是setTimeout()中的函数是异步回调的~~并且js是单线程的!

就是在执行下面这段代码时,浏览器执行到setTimeout()时,会将function(){console.log(i)}扔到事件队列中,让他在事件队列中等着,然后继续for循环

浏览器的事件队列

当for循环结束后,将要执行事件队列中的回调函数~

回调函数的触发要么是事件,要么是时间。这里是setTimeout(),触发靠的是时间,时间耗光了,回调函数也就执行了,由于在回调函数执行之前,for循环已经结束,i的值是5; console.log(i);也就输出了5。实际代码的执行也可以如下理解:

for(var i=0;i<5;i++){} 

setTimeout(function(){ console.log(i) },0); 

setTimeout(function(){ console.log(i) },1);

setTimeout(function(){ console.log(i) },2);

setTimeout(function(){ console.log(i) },3);

setTimeout(function(){ console.log(i) },4);

我感觉这样对理解第四个函数的结果就应该很清楚了。

然而第二个,第三个函数,在for循环内自执行,就是在函数体本身加上()和后面加上(),如果要传参,就向第二个()中填写即可,想必有些初学者,对于函数传参会有些疑问:

JavaScript函数是不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数值接受两个参数,在调用这个函数时也未必一定要是两个参数。可以传递一个、两个、三个甚至也可以不传参数,而解析器永远不会care。因为JavaScript中的参数在内部是用一个数组来运行的。函数接受到的永远是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任何元素,没关系;如果包含多个元素,也没有问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。

同时还牵扯到JavaScript中作用域的问题,简单的理解:在当前作用域(在这里可以理解为function函数内),如果找不到 i 的值,他就会向父作用域去找,也就是这里的for循环中,所以输出也就很明显了。

相关文章

  • 结合实例浅谈JS回调函数、函数传参及作用域

    分别写出for循环的打印值 for(var i=0;i<5;i++){ console.log(i) } for...

  • 闭包

    js的作用域分为全局作用域,和函数作用域, 内部作用域可以访问外部作用域的函数参数,外部不能访问内部函数的变量和参...

  • JavaScript 05 函数

    js函数的概念和作用,js函数的定义,js函数的调用,js事件驱动的概念,js函数的实参和形参,js的作用域,js...

  • 函数

    简单函数格式 定义 调用函数 传参函数格式: 传参数 定义 注意 重点 实例(简单) 实例(传参) 实例函数(调用...

  • apply和call语句

    运动框架的应用实例 结合 异步和回调函数 中的 「回调函数2」我们可以试图在回调函数中,用this表示oDiv对象...

  • JavaScript 模式(四)

    函数模式 1.回调模式 【基本模式】 回调模式下,回调函数作为参数可以是一个已有的函数,也可以是匿名函数 【作用域...

  • js中回调函数的学习笔记

    回调函数是什么在学习之前还真不知道js回调函数怎么使用及作用了,下面本文章把我在学习回调函数例子给各位同学介绍一下...

  • 2018-01-05

    你不知道的JS 上篇 函数作用域和块作用域函数作用域指属于函数的全局变量都可以在整个函数的范围内使用及复用隐藏内部...

  • [Angular]依赖注入

    JS中的依赖注入,举个荔枝: 1.回调函数的event就是依赖对象2.回调函数有形参就是依赖注入(设置方法或者函数...

  • JS的作用域

    JS的作用域: 全局作用域、函数作用域、eval 作用域、块级作用域 全局作用域: 函数作用域: 结果截屏: 说...

网友评论

    本文标题:结合实例浅谈JS回调函数、函数传参及作用域

    本文链接:https://www.haomeiwen.com/subject/wzdjlxtx.html