js中作用域有全局作用域,函数作用域,还有块级作用域(很少,一般认为没有);
什么是作用域?
一套设计良好的可以用来存储变量的规则称之为作用域。(来自《你不知道的js》)
我通俗认为,就是一个作用范围的意思
全局作用域:
最顶层的作用域,全局变量和全局中声明的函数都在该作用域。
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
什么是作用域?
一套设计良好的可以用来存储变量的规则称之为作用域。(来自《你不知道的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
本文深入讲解JavaScript中的作用域概念,包括全局作用域、函数作用域及块级作用域,并通过具体示例阐述不同作用域的特点及其在实际编程中的应用。

4880

被折叠的 条评论
为什么被折叠?



