for(var i=0;i=3;i++){ setTimeout(function() { console.log(i) }, 10);}
创新互联专业为企业提供会昌网站建设、会昌做网站、会昌网站设计、会昌网站制作等企业网站建设、网页设计与制作、会昌企业网站模板建站服务,十余年会昌做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
答案:打印4次4
这道题涉及了异步、作用域、闭包
settimeout是异步执行,10ms后往任务队列里面添加一个任务,只有主线上的全部执行完,才会执行任务队列里的任务,当主线执行完成后,i是4,所以此时再去执行任务队列里的任务时,i全部是4了。对于打印4次是:
每一次for循环的时候,settimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里面,等待执行,for循环了4次,就放了4次,当主线程执行完成后,才进入任务队列里面执行。
(注意:for循环从开始到结束的过程,需要维持几微秒或几毫秒。)
当我把var 变成let 时
for(let i=0;i=3;i++){ setTimeout(function() { console.log(i) }, 10);}
打印出的是:0,1,2,3
当解决变量作用域,
因为for循环头部的let不仅将i绑定到for循环快中,事实上它将其重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。setTimeout里面的function()属于一个新的域,通过 var 定义的变量是无法传入到这个函数执行域中的,通过使用 let 来声明块变量,这时候变量就能作用于这个块,所以 function就能使用 i 这个变量了;这个匿名函数的参数作用域 和 for参数的作用域 不一样,是利用了这一点来完成的。这个匿名函数的作用域有点类似类的属性,是可以被内层方法使用的。
查了一下百度的一个答案:
setTimeout是一次执行函数,这里是10ms后执行,仅仅执行一次;for(var i=0;i=3;i++),i的每次取值都是执行setTimeout这个函数,并没有执行setTimeout里面的function(即闭包函数),setTimeout里面的function是有setTimeout的定时触动的,也就是10ms后执行,也就是说i从0~3时,一共执行了4次的setTimeout()函数,此时的i的值是4,由于for语句的执行速度远小于1秒,所以,1秒后,由setTimeout()函数定时触动的闭包函数function()开始执行,alert(i);i的值已经是4了,所以相继打印4次i.
匿名函数:定义时未定义函数的名称
闭包: 创建时封装周围状态的函数,及时周围的环境不存在了,闭包中的状态还会存在
从理论上讲 匿名函数和闭包属于两种概念,PHP中视为相同
1.非匿名函数在定义时就创建函数对象和作用域对象。以后及时未调用,也占空间
2.匿名函数只有在调用时,才会创建函数对象和作用域对象。调用完后立即释放,节省内存。适合做回调函数
javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环境,增加代码的兼容性。
(function(){})是一个标准的函数定义,但是没有复制给任何变量。所以是没有名字的函数,叫匿名函数。没有名字就无法像普通函数那样随时随地调用了,所以在他定义完成后就马上调用他,后面的括号()是运行这个函数的意思
扩展资料
函数声明:使用function声明函数,并指定函数名。
function setFn() { // coding }
函数表达式:使用function声明函数,但未指定函数名,将匿名函数赋予一个变量。
var setFn = function() { // coding}
匿名函数:使用function关键字声明函数,但未指定函数名。匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
function() { // coding}
参考资料:百度百科 - javascript
函数的另外一种表现形式,还是函数,只适用于函数功能比较简单的函数(声明的格式和普通的函数不一样)
就是变量能够使用的范围
a = 520
在函数中:
global 变量名
变量名 = 值
语法:
nonlocal 局部变量
局部变量 = 值
python中声明函数其实就是声明一个数据是function的变量,函数名就是变量名
对比如下:
变量作为函数的返回值
函数1作为函数2的返回值 - 函数2是返回值高阶函数
//作用域和匿名函数没用任何关系
//js中函数内的变量在函数内的任何地方都能访问
//window对象下定义的变量均为全局变量,如:
var i = 1; //这个变量就是全局变量
function fun(){
var j = 1; //这个j是局部变量,在fun里面的任何地方都能访问
}
//说匿名函数
$(function(){
//这个function(){}就是匿名函数
});
var fun1 = function(){
//这个function(){}也是匿名函数
}
//论匿名函数的重要性
//js中的匿名函数的重要性不亚于三元运算
//不过js中任何能用匿名函数实现的代码用普通函数都能实现
//就好比任何三元运算都能用if实现一样
$("body").click(function(){
//jquery最基本的绑定click事件的一种
});
//上面这里用的就是匿名函数,可以用下面的代码代替
function clickHandle(){
}
$("body").click(clickHandle);
//说自运行函数
(function(){
//这里还是匿名函数
})();
//上面的自运行函数(闭包操作)可以改成下面这样
function tempFun(){
}
tempFun();
//有帮助的话麻烦采纳下,手打不易,谢谢!
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款