作用域的简介

文章目录

  • 一、作用域的含义
  • 二、作用域的分类
    • 1.全局作用域(global scope)
    • 2.局部作用域(local scope)
    • 3.块级作用域(block scope)
  • 三、题目及总结
    • 1.题目
    • 2.题目总结

一、作用域的含义

指一个变量的作用范围。

二、作用域的分类

1.全局作用域(global scope)

直接编写在 script 标签中的 js 代码,都会在全局作用域中。全局作用域会在页面打开时创建,在页面关闭时销毁。

let a = 18;
function fun() {let a = 20;
}
fun();
console.log(a); // 输出 18
注意:全局作用域的变量都是全局变量,在页面中的任意地方都可以访问和修改。

2.局部作用域(local scope)

局部作用域也称为函数作用域。调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁。

每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。在函数作用域中可以访问到全局作用域中的变量;在全局作用域中无法访问到函数作用域的变量。

当在函数作用域中操作一个变量时,它会先在自身的作用域中去找,若有则直接使用;若没有则向上一级作用域中寻找。直接找到全局作用域,若全局作用域仍未找到,则直接报错:Reference Error

    注意:局部作用域的变量时局部变量,只能在变量所在的局部作用域中进行访问和修改。
// 情况1:当在函数作用域中操作一个变量时,它会先在自身的作用域中去找,若有则直接使用; 
let a = 18; 
function fun() {let a = 20; console.log(a);} 
fun(); // 输出 20
//情况2: 直接找到全局作用域 
let a = 18; 
function fun() {console.log(a); 
} 
fun(); // 输出 18
// 情况3:若全局作用域仍未找到,则直接报错:Reference Error
function fun() {console.log(a); 
} 
fun(); // 报错 Uncaught ReferenceError: a is not defined
注意1: 在函数内部没有声明直接赋值的变量也属于全局变量。但是不推荐这种方式声明全局变量
let a = 18; 
function fun() {b = 20; 
} 
fun(); 
console.log(b); // 输出为 20
注意2:函数内部的形参可以看做是局部变量。
function fun(a) {a = 18; // 相当于let a = 18; console.log(a); 
} 
fun(); // 输出18

3.块级作用域(block scope)

在 {} 之间定义的 js 代码是块级作用域。

注意:在块级作用域里定义的变量是块级变量,只在该块级作用域中有效。
// 求0-10的和
let sum = 0; 
for (let i = 1; i <= 10; i ++) { // i 是块级变量sum += i;
}
document.write(sum);

三、题目及总结

1.题目

function fun1() {let num = 123; function fun2() {let num = 0;console.log(num); } fun2(); 
} 
let num = 456; 
fun1(); // 输出 0
let a = 1;
function fun1() {let a = 2; let b = '22'; fun2(); function fun2() {let a = 3; fun3(); function fun3() { let a = 4;console.log(a); // 输出 4 console.log(b); // 输出 22 }} 
} 
fun1();

2.题目总结

变量访问原则——作用域链。

只要是代码,就至少有一个作用域。

写在函数内部的局部作用域。

如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。

根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访 问,就称作作用域链。

作用域链:采取就近原则的方式来查找变量最终的值。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部