[TOC]
# 1. 函数闭包
闭包就是能够读取其他函数内部变量的函数,由于在 Javascript 语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成 **定义在一个函数内部的函数**。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的用途:
* 可以在函数外部读取函数内部成员
* 让函数内成员始终存活在内存中
示例:
```js
function fn () {
var count = 0
return {
getCount: function () {
console.log(count)
},
setCount: function () {
count++
}
}
}
var fns = fn()
fns.getCount() // => 0
fns.setCount()
fns.getCount() // => 1
```
思考1:
```js
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
console.log(this); // object
return function () {
console.log(this); // window
return this.name; // 而这里的this是window对象
};
}
};
console.log(object.getNameFunc()()); // The Window
```
思考2:
```js
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
var that = this;
console.log(this); // obeject
return function () {
console.log(this); // window
console.log(that); // object
return that.name;
};
}
};
console.log(object.getNameFunc()()); // My Object
```
# 2. 沙箱
示例1:
```js
//沙箱:环境,黑盒,---在虚拟的世界中,模拟真实世界的场景,做实验,实验的结果和真实世界的结果一样,但是不会影响真实的世界
//沙箱可以解决命名冲突的问题
//以后的代码--->尽可能的放在沙箱中
var num=100;
//沙箱的代码
(function () {
var num=10; // 不与全局的num冲突
num++;
console.log(num);//11
})();
console.log(num);//100
```
示例2:
```js
//沙箱可以解决命名冲突的问题
(function () {
var x=10;
function f1() { // 与下面的f1不冲突
}
}());
(function () {
var x=10;
function f1() {
}
}());
```
- js应用场景
- js组成
- js书写位置
- 浮点数精度问题
- undefined与null的区别
- 数据类型转换
- 运算符优先级
- 代码调试
- 函数
- 函数的定义和调用
- 函数的return细节
- 函数是一种数据类型
- this的指向
- 函数成员
- 函数闭包
- 作用域
- 预解析
- js对象
- 对象的创建与调用
- new关键字
- this关键字
- 构造函数创建对象
- 事件
- 数据类型
- 继承
- 杂项
- 如何阻止标签的默认行为
- 为一个标签绑定或移除任何一个事件
- 如何阻止事件的冒泡行为
- 事件的三个阶段
- 移动元素的条件
- 匀速动画函数封装
- 变速动画函数封装
- 获取元素的css属性值
- 数据类型判断方法
- 创建对象的7种写法
- 如何继承
- 为js内置对象添加原型函数
- 将局部变量转换为全局变量
- call函数的用法
- 沙箱
- 浅拷贝
- 深拷贝
- 对象赋值会改变对象
- 解析URL中的字符串
- 格式化日期
- 获取当前浏览器类型
- Vue3.x
- 调式工具Vue Devtools