let site = "php.cn";
console.log(site);
function site(){
let domain = "jd.com";
return `${site}[${domain}]`;
//这里要返回一个叫site的变量
// 有一个查询的过程,先在自身的作用域中找一个有没有叫site的
// 如果有 则直接返回它
// 如果函数中没有这个site 则自动到函数的上一级作用域中去查询site
// 全局中正好有一个site,于是就返回了全局的site
// 查询变量的过程,就是一个链式查询的过程 就是作用域链
}
site是声明在函数外部的全局变量
在函数内部可以访问到外部的全局变量
let site = "jd.com";
//私有成员,仅限在当前作用域内访问,外部不可见
// {}就是代码块
// if while循环 会用到块作用域 var声明的变量 不支持块作用域 外部可见 会造成变量泄露
{
let a = 1;
const b = "hello";
}
console.log(a, b);
console.log(getSite());
let c = 100;
function sum(a, b) {
// return a + b;
// 已经产生闭包了
// 函数中的变量按来源有两种类型
// 1:形参:ab 函数自有的
// 2 自由变量 c c并不是函数自由的 是一个外来者、
// 当前的函数可以访问到上一级 / 外部的自由变量;
// 闭包:能够访问自由变量的函数
// 理论上讲 所有函数都是闭包
return a + b + c;
}
console.log(sum(4, 5));
// 通过闭包来访问内部的私有变量
function demo1() {
// 私有变量
let email = "a@qq.com";
// return email; 这样是不好的。
// 通过这个可以对变量进行隐藏 可以做一个权限控制
// 返回一个函数的函数 称之为高阶函数
return function d() {
// 对于这个d函数来说 email就是他的自由变量
return email;
};
// 其实还是没类 只是通过语法糖 把一些细节封装了
// 使用构造函数来模拟类 类是对象的模板
function User(name, email) {
this.name = name;
this.email = email;
// show()输出属性
// this.show = function () {
// return { name: this.name, email: this.email };
// };
}
//构造函数对象的原型对象上的成员,可以被所有实例所共享
User.prototype.show = function () {
return { name: this.name, email: this.email };
};
// 现在show()全在原型 __proto__里面了 实现了代码封装和方法复用
// 创建两个对象 会自动创建两个show()这是没必要的 所以我们可以放到原型上进行方法共享
const user = new User("xxx", "xxx@xx.com");
console.log(user);
console.log(user.show());
const user1 = new User("xxx1", "xxx1@xx.com");
console.log(user1);
console.log(user1.show());