看见几道前端试题, 挺有意思, 拿出来分享一下.
for(var i =0; i< 10; i++){
setTimeout(() => console.log(i),1000)
}
// 问: 代码执行多少次, 分别输出什么
function text(){
var i = 0
return function B(){
console.log(++i)
}
}
var S = text()
S()
S()
// 问: 分别输出什么
直接看答案, 在浏览器中的运行结果:
image.png
var如果换成let 就会是0-9
image.png
业界前辈点评: 通过var定义的变量,作用域是整个封闭函数,是全域的 。通过let定义的变量,作用域是在块级或是子块中 image.png
js中的函数和变量作用域是一个有意思的话题, 我也不能很清楚的判断, 多数时候还是通过运行看结果. 大家可以参考<<Javascript语言精粹>>这本书. 很多问题来自ES3以及更早的版本. ES5和ES6引进了一些新的语法, 但基本是在不改变原有语义的基础上添加, 所以现在是新坑旧坑并存. 如果再考虑各种浏览器和运行环境的不同实现, 技术人员的处境也确实让人心酸.
网友评论