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());
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号