详解JavaScript作用域、作用域链和闭包的用法
1.作用域
作用域是指可访问的变量和函数的集合。
作用域可分为全局作用域和局部作用域。
1.1全局作用域
全局作用域是指最外层函数外面定义的变量和函数的集合。
换言之,这些最外层函数外面定义的变量和函数在任何地方都能访问。
举个例子:
//最外层定义变量 vara=1; console.log(a);//最外层可以访问 functionfnOne(){//最外层函数 console.log(a);//函数内可以访问 functionfnTwo(){//子函数 console.log(a);//子函数内也可以访问 } } //说明 在最外面定义一个变量,不仅在最外面可以访问, 在函数内也能访问,在函数的子函数内也能访问。
1.2局部作用域
局部作用域是指在函数内部定义的变量和函数的集合。
换言之,这些在函数内部定义的变量和函数,在函数外面是无法访问的,只能在函数内部(包括函数的子孙函数)访问。
举个例子:
functionfnThree(){ //在函数内定义变量 varb=2; console.log(b);//函数内部可以访问 functionfnFour(){ console.log(b);//子函数内也能访问 } } //函数外不能访问 //console.log(b); //说明 在函数fnThree中定义一个变量b,在函数内可以访问, 在子函数fnFour中也能访问,但在函数fnThree外是不能访问的。
2.作用域链
从上面的两个例子可以看出,最里层的子函数不仅可以访问最外层函数内的变量,还能访问最外层函数外的全局变量。
这是因为,在创建最外层函数的时候,会把全局作用域拿过来,然后在创建子函数时候,又会把最外层的作用域(包括全局作用域)拿过来,就这样一环扣一环,就形成了作用域链。
所以,作用域链是指内层函数拥有外层函数到最外层(最外层函数外,全局)的所有作用域列表。
3.闭包
闭包就是能够读取其他函数内部变量的函数。(——百度百科)
从上面的第二个例子可知,函数外是不能访问函数内部定义的局部变量,但是闭包提供了可能。
举个例子:
functionUser(){ //定义私有变量 varuserName="default"; //提供setUserName()方法 functionsetUserName(uName){ userName=uName; } //提供getUserName()方法 functiongetUserName(){ returnuserName; } //将方法对外开放 return{ set:setUserName, get:getUserName } } varuser1=User(); user1.set('tom'); console.log(user1.get()); varuser2=User(); user2.set('jack'); console.log(user2.get()); //说明 User函数内部定义变量uesrName, 并在内部定义两个子函数操作userName, 最后将两个子函数返回(一个可直接放回,多个可放到对象中返回。)。 这样,在函数外面可以调用子函数访问函数内部的变量, 这两个子函数便实现了闭包的功能。
以上就是详解JavaScript作用域、作用域链和闭包的用法的详细内容,更多关于JavaScript作用域、作用域链和闭包的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。