js作用域

本文深入讲解JavaScript中的作用域概念,包括全局作用域、函数作用域及块级作用域,并通过具体示例阐述不同作用域的特点及其在实际编程中的应用。
js中作用域有全局作用域,函数作用域,还有块级作用域(很少,一般认为没有);

什么是作用域?
一套设计良好的可以用来存储变量的规则称之为作用域。(来自《你不知道的js》)
我通俗认为,就是一个作用范围的意思


全局作用域:
最顶层的作用域,全局变量和全局中声明的函数都在该作用域。

例:

var a;//声明全局变量
function b(){};//全局中的函数


函数作用域:
可以认为是函数{}的范围;
即函数内的声明的变量和函数在该函数外访问不到,函数作用域形成了一堵墙一样。
例:
function c(){
var a;//声明局部变量
a = 2;
function d(){
alert(a);
}
}
console.log(a);//a is not defined
d();//d is not defined


块级作用域:
任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。


一般语言如C、C++中都有块级作用域,但是js中几乎没有!


如C、C++中if(){},for(){}可以形成块级作用域,但js中只有函数{}有作用域,在if、for中声明的变量会变为全局变量。(如果if、for不是在函数里)


为什么说几乎呢?因为js中还是有一些特殊的块级作用域。
例:
1.with()
用with从对象中创建的作用域仅在with声明中而非外部作用域中有效


2.try/catch
catch分句会创建一个块级作用域,其中声明的变量仅在catch内部有效。
try{
undefined();//执行一个非法操作强制制造一个异常
}catch(err){
console.log(err);//可以正常执行,抛出错误TypeError: undefined is not a function
}
console.log(err);//无法获取err,产生错误ReferenceError: err is not defined


3.let关键字
(还没学ES6,可能说的有点模糊)
let关键字可以认为是var的兄弟(也可以说表亲,我就认为是兄弟,hhh~~~),他可以用来声明变量。但是它声明的变量会使该变量绑定到所在的任意作用域中,即会使变量变成let所在的块形成一个块级作用域(仅针对let声明的变量)。
例:
var a = true;
if(a){
let b = 4;
console.log(b);//4
}
console.log(b);//ReferenceError: b is not defined


var a = true;
if(a){
let b = 4;
var c = 5;
console.log(b);//4
console.log(c);//5
}
console.log(b);//ReferenceError: b is not defined
console.log(c);//5
4.const
同样来自ES6,可以用来创建块级作用域,但值是常量(固定的)
例:
var foo = true;
if(foo){
var a=2;
const b=3;
a = 3;//正常
b = 4;//错误
}
console.log(a);//3
console.log(b);//ReferenceError

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值