关于JS中for循环时,作用域问题和this指针指向的总结
来源:互联网 发布:msg用什么软件打开 编辑:程序博客网 时间:2024/05/29 03:29
在大多数计算机语言中,{}这样一对花括弧叫一个块级作用域,也就是一个执行环境。在一个执行环境中,执行环境内部的变量在作用域外部式无法被访问到的。执行环境内部倒是可以访问外部的变量。
但由于JS中没有块级作用域,只有函数作用域。所以类似于像for(;;){ }这样的作用域,实际上它还是在它的上层作用域之内,如果它上层作用域是global或window,那么实际上这个for循环还是在全局作用域下。
所以,在典型的JS面试题中出现的例子:
const Greeters = []for (var i = 0 ; i < 10 ; i++) { Greeters.push(function () { return console.log(i) })}Greeters[0]() // 10Greeters[1]() // 10Greeters[2]() // 10
由于,此处默认for语句是在全局作用域下,且for循环并不会生成块级作用域,因此,var声明的i变量也就自然在全局作用域之下,在for循环中又出现了一个匿名函数,这个匿名函数倒是有自己的函数作用域。所以,事实上,这个匿名函数先是写好放在那里,还没有被外部声明调用,它就仅仅地待在那里,当外部声明一个Greeters[0]()想要调用这个函数作时,由于i是在全局作用域被var声明出来的,i已经事先被fior语句循环到等于10了,i=10已经事先固定地保存在全局作用域之中不动了。程序再才来调用的这个函数内部的i。这时,函数只需要去全局作用域环境去找到那个事先已经被固定下来的i=10的那个i就行了,所以,无论调用多少次,它只会去调用那个事先已经循环完毕,并被放入全局作用域下i=10那个i。换句话说,for循环语句的那个{}相当于可以视为没有写。
那么如何解决这个问题呢?
又因为JS中var来声明变量时,var声明出来的变量是在当前作用域环境之下, let声明出来的变量也是在当前作用域之下。不一样的是:let可以把类似于这种JS里面不是块级作用域的作用域(例如for(;;){})变成一个块级作用域,而var不会。并且var可以多次声明同一个变量名,而let不行
var a = 5; var a = 3; let b = 2; let b = 4; console.console.log(a); console.console.log(b); // Identifier 'b' has already been declared所以,我们可以用ES6的语法let来创建一个块级作用域。
const Greeters = []for (let i = 0 ; i < 10 ; i++) { Greeters.push(function () { return console.log(i) })}Greeters[0]() // 0Greeters[1]() // 1Greeters[2]() // 2
此时,从外部去调用由于用let每创建一个i,就会去执行一遍内部的匿名函数,并保存起来push进数组Greeters[]里,当你想要调用某一个数组里的函数时,就直接Greeters[i]() 调用对应的数组函数并console.log出当前的i了。
阅读全文
0 0
- 关于JS中for循环时,作用域问题和this指针指向的总结
- JS中setTimeout的作用域以及this的指向问题
- JavaScript中setTimeout的作用域以及this指向问题
- 关于js中的this的指向问题
- js中关于this的指向
- js中this关键字的指向问题
- 理解js中this的指向问题
- js中this的指向问题
- 关于函数中this指向的问题
- JS中this的作用域问题
- js中this指向总结
- js中this指向总结
- js中this指向问题
- js中this指向问题
- what's this? 浅谈js中this的指向问题
- js中this的指向
- js中this的指向
- js中this的指向
- jquery实现button按钮的点击事件
- 七个结构型模式7:代理模式-Proxy Pattern【学习难度:★★★☆☆,使用频率:★★★★☆】
- oracle之表的管理
- Python-进程管理Supervisord
- 利用Delphi的File Of Type创建并管理属于你自己的数据库
- 关于JS中for循环时,作用域问题和this指针指向的总结
- 网络应用的体系结构
- python爬虫实战(一)--爬取知乎话题图片
- 数据结构第二周项目--体验复杂度之两种排序算法的运行时间
- 剑指offer 32 整数中1出现的次数
- 数组排序
- 51nod 1432 (贪心)
- 域名备案图文教程
- BZOJ 4516 后缀自动机