JavaScript作用域和作用域链
javaScript作用域
作用域:就是代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突。
JS的作用域(es6)之前:全局作用域 局部作用域
1.全局作用域:整个script标签 或者是一个单独的js文件
var num = 10;
2.局部作用域(也称为函数作用域):在函数内部就是局部作用域 这个代码的名字只在函数内部起效果和作用。
function demo() {
var num = 20;
console.log(num);
}
demo();
变量的作用域
变量作用域:根据作用域的不同我们变量分为全局变量和局部变量
1.全局变量:在全局作用域下的变量 在全局下都可以使用
注意:如果在函数内部 没有声明直接赋值的变量也属于全局变量
var num = 10; //num就是一个全局变量
console.log(num);
function fn() {
console.log(num);
}
fn();
2.局部变量 在局部作用域下的变量 或者在函数内部的变量就是 局部变量
function fun() {
var num1 = 10; //num1就是局部变量 只能在函数内部使用
num2 = 20; // 在函数内部没有声明直接赋值是全局变量
}
fun();
注意:函数的形参实际上就是局部变量
3.从执行效率来看全局变量和局部变量的区别
- 全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
- 局部变量 当我们程序执行完毕就会销毁,比较节约内存资源
JS没有块级作用域(了解)
块级作用域由 {} 包括。
在其他编程语言中如:Java、C#等,在if语句、循环语句中创建的变量,仅仅只能在if语句、本循环语句中使用,如下面的Java代码:
Java有块级作用域:
if (true) {
int num = 123;
system.out.print(num); // 123
}
system.out.print(num); // 报错
以上Java代码会报错,是因为代码中 {} 即一块作用域,其中声明的变量 num ,在“ {} ” 之外不能使用;而与之类似的javaScript代码,则不会报错。
JS中没有块级作用域(在ES6之前)
if (true) {
var num = 123;
console.log(123); // 123
}
console.log(123); // 123
作用域链
- 只要是代码,就至少有一个作用域
- 写在函数内部的是局部作用域
- 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
- 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链
var num = 10;
function fn() { // 外部函数
var num = 20;
funtion fun() { // 内部函数
console.log(num); // 20
}
fun();
}
fn();
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
作用域链第4点,最后少了一个字
好了
hhh,我就是那啥,