<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//作用域
// - 指一个变量作用的范围
// - js中有2中作用域 1 全局作用域 2 函数作用域(局部作用域)
// 1 全局作用域
// - 直接编写在script标签中的js代码,都是全局作用域;
// - 全局作用域在页面打开时创建,页面关闭时销毁;
// - 在全局作用域中有一个全局对象window,可以直接使用,windowd代表一个浏览器窗口,由浏览器创建可以直接使用
// - 在全局作用域中 创建的变量都会作为window对象的属性保存
// - 在全局作用域中 创建的函数将会作为window对象的方法保存
// - 全局作用域中的全局变量在页面任意部分都可以访问到
// console.log(window); //Window {window: Window, self: Window, document: document, name: "", location: Location, …} 输出全局对象,window对象可以直接使用
// var a = 666; //全局作用域下创建一个变量
// console.log(window.a); //666 变量a作为window对象的属性
// var b = 888;
// console.log(window.b); //888
// console.log(window.c); //undefined
// console.log(c); //ReferenceError: c is not defined 报错,直接全局作用域中找变量会报错
// function fun() {
// var a = 123;
// }
// fun();
// console.log(a); //ReferenceError: a is not defined
//全局作用域下创建一个函数
// function fun1() {
// console.log(888666);
// }
// fun1(); //888666
// window.fun1(); //888666 因为fun1在全局作用域中创建的函数将作为window对象的方法保存,故可以调用window对象的方法的形式调用函数
// window.alert(2333333); //alert函数也是window对象的方法
// a = 132;//对a未定义变量也可以,相当于window.a = 123; 在window对象中添加了属性a
// console.log(a); //123
// console.log(a); //undefined 先在控制台输出a,再赋值将输出undefined
// var a = 123;
//48 49行代码涉及到变量提升,var关键字声明的变量 将会在代码执行之前被声明 相当于以下代码
// var a;
// console.log(a);
// a = 123; //因为先声明了变量 在控制台输出的之后再做了赋值,故控制台输出为undefined
//如果声明变量不用关键字var 则没有变量提升 故以下输出报错
// console.log(a); //ReferenceError: a is not defined 报错
// a = 123;
//- 函数的声明提前
// - 使用函数声明形式创建的函数function(){} 它会在所有代码执行之前创建,故可以在函数声明之前调用函数
// - 使用函数表达式创建的函数不会被声明提前,所以不能在声明前调用,
//函数声明会提前创建
// fun(); //666 fun在函数声明之前调用函数
// function fun() {
// console.log(666);
// }
//函数表达式不会提前创建
// fun2(); //TypeError: fun2 is not a function
// var fun2 = function() {
// console.log(888);
// };
// 2 函数作用域
// - 调用函数时 创建函数作用域,函数执行完毕后,函数作用域销毁
// - 每调用一次函数,就会创建一个新的函数作用域,他们之间是相互独立的
// - 函数作用域中可以访问全局作用域中的变量
// - 在全局作用域中无法访问局部作用域中的变量
// - 当在函数作用域中操作一个变量时,会先在自生作用域中寻找,有则使用,无则向上级作用域中,一次循环 如果全局作用域中依然没有找到则报错
// - 在函数中访问全局变量可以使用window对象
//创建一个全局变量
var a = 666;
function fun() {
var a = 123; // 在函数作用域中创建变量a
var b = 888; //在函数作用域中声明变量b
// function fun2() {
// console.log(a); //自己无a 上级有123
// console.log(window.a); //加window可以直接访问全局变量a666
// }
// console.log(a); //函数局部作用域中访问全局作用域中的a(不执行91
console.log(a); // 先在自己找 有 123(执行91
}
fun(); //666
// console.log(b); //ReferenceError: b is not defined
console.log(a);
// 在函数作用域中也有声明提前特性
// 使用var声明的变量,会在函数代码执行之前被声明
// 函数声明也会在函数代码执行之前执行
function fun3() {
// console.log(c); //undefined
fun4();
function fun4() {
console.log('qwe');
}
// var c = 456;
}
fun3();
// 在函数中不适用var声明的变量就是全局变量
var d = 789;
function fun5() {
console.log(d);
d = 666; //d没有使用var,则是全局变量 相当于window.d = 666;
}
fun5();
console.log(d); //全局输出d 666
var e = 321;
function fun6(e) { //定义形参相当于在函数作用域中声明变量 相当于var e 但是实参没有赋值,故控制台为undefined
console.log(e); //undefined
}
fun6();
</script>
</body>
</html>
全局作用域 局部作用域(函数作用域)
最新推荐文章于 2022-09-30 10:55:27 发布