<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>作用域和闭包</title>
</head>
<body>
<script>
//作用域:全局,函数,块
//1. 全局作用域,默认的,不可删除
// let site = "php";
console.log(site);
//由全局对象调用
//全局对象:如果在浏览器中运行js,那么全局对象就是window
console.log(window.site);
//2.函数作用域
function getSite(){
//site是声明在函数外部的全局变量
//在函数内部可以访问到外部的全局变量
// let site = "京东";
//私有成员,仅在当前作用内访问,外部不可见
let domain = "php.cn";
return site;
}
console.log(getSite());
// console.log(domain);
// 3.块作用域
{
let a = 1;
const B = "Hello";
//var不支持块作用域,声明的变量会泄露到函数外
var a = 1;
var B = "Hello";
}
console.log(a, B);
//4.闭包
let c = 100;
function sum(a,b){
// return a+b;
// 现在已经产生了闭包
// 函数中的变量来源有两种类型
// 1.形参:a,b,这是函数自有的
// 2.自由变量:c,c并不是这个函数自有的
// 当前函数可以访问到上一级/外部的自由变量
//闭包:能够访问自由变量的函数就是闭包
//理论上来讲,所有函数都是闭包
return a+ b+ c;
}
console.log(sum(4,5));
//通过闭包来访问内部的私有变量
function demo1(){
//室友变量
let email = "qq.com";
function d(){
//对于这个子函数,email就是他的自由变量
return email;
}
}
let f = demo1();
console.log(f())
</script>
</body>
</html>