setTimeout面试笔试题及理解

setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。

语法:

setTimeout(code, milliseconds, param1, param2, ...)
setTimeout(function, milliseconds, param1, param2, ...)

直接console

for(var i = 0; i < 5; i++) {
	console.log(i);		// 0 1 2 3 4 
}

var 定时器时间为1000
setTimeout是异步执行,在执行setTimeout时,i已经为5了

for(var i = 0; i < 5; i++) {
	setTimeout(
		function() {
			console.log(i)	// 5 5 5 5 5 
		}, 1000)
}

var 定时器时间为0

for(var i = 0; i < 5; i++) {
	setTimeout(
		function() {
			console.log(i)	// 5 5 5 5 5 
		}, 0)
}

如果想要输出 0 1 2 3 4

一 、利用setTimeout的第三个参数
var ,将i作为参数传递给setTimeout

for(var i = 0; i < 5; i++) {
	setTimeout(
		function(i) {
			console.log(i)	// 0 1 2 3 4 
		}, 1000, i)
}

二、使用IIFE(立即执行的匿名函数)

for(var i = 0; i < 5; i++) {
	(function(i){
		setTimeout(
			function() {
				console.log(i)	// 0 1 2 3 4 
			}, 1000)
	})(i)
	
}

三、使用bind方法
bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用。
bind MDN详细解释

for(var i = 0; i < 5; i++) {
	setTimeout(
		function(i) {
			console.log(i)	// 0 1 2 3 4 
		}.bind(null,i), 1000)
}

四、es6中的let声明的变量是具有块级作用域
let 定时器时间为0

for(let i = 0; i < 5; i++) {
	setTimeout(
		function() {
			console.log(i)	// 0 1 2 3 4 
		}, 0)
}

let 定时器时间为1000
let 语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。
let声明的变量只在其声明的块或子块中可用,这一点,与var相似。二者之间最主要的区别在于var声明的变量的作用域是整个封闭函数。

for(let i = 0; i < 5; i++) {
	setTimeout(
		function() {
			console.log(i)	// 0 1 2 3 4 
		}, 1000)
}

你可能感兴趣的:(#,javaScript)