转载自 水歌博客,方便学习,顺便前排观望大佬!
JavaScript 是一门原生支持函数式编程范式的、基于原型的面向对象语言,也是一门弱类型动态脚本语言javascript
JavaScript 函数的
this
是由函数调用者在调用前肯定的 —— 继承自 LISP 语言java
用 ECMAScript 6 解释以下:编程
调用方式 | 调用者 | 等效代码 |
---|---|---|
func(...params) |
JS 引擎 | func.apply(null, params) |
obj.func(...params) |
一个对象 | func.apply(obj, params) |
new func(...params) |
new 运算符 |
func.apply(Object.setPrototypeOf({ }, func.prototype), params) |
element.onclick = func |
DOM 事件回调 | func.call(element, event) |
上述最后一种实际上是运行时 API 级别的,与语言自己无关,用 JS 写的公共库须要回调函数时,也是库内部调用时如上手动指定的。bash
通俗解释:闭包
孩子靠着自创资产和本身可掌控的父母遗产,继续活下去app
技术解释:异步
局部做用域中建立的函数,若引用了其上级做用域中的变(常)量,又在上级做用域外有引用,上级做用域执行结束被销毁时,此函数及其引用的数据造成一个不被销毁的闭包。async
—— 继承自 LISP 语言函数式编程
var closure = function () {
const privateData = { };
return {
set: function (key, value) {
privateData[key] = value;
},
get: function (key) {
return privateData[key];
}
};
};
closure.set('A', 1);
console.log( closure.get('A') ); // 1
复制代码
闭包在 ECMAScript 5 及更早的时代,经常使用于模拟块级做用域、模块做用域,在 ECMAScript 6 引入这两种新局部做用域后,它们又成了造成闭包的上级做用域之一。函数
基于原型的面向对象语言 可看做把 基于类的面向对象语言的运行时内部构造 开放了出来
类 | 原型 | |
---|---|---|
对象的建立 | 由 class 的构造函数修饰 this |
直接 new 一个函数做为构造函数 |
对象的继承 | 只知其然,不知因此然 | 对象内部引用构造函数的原型对象,在引用对象未定义成员时,在原型上找同名成员 |
类的继承 | 只知其然,不知因此然 | Child.prototype = new Parent() |
私有成员 | 只知其然,不知因此然 | 用局部做用域“对外不可访问性”保存的私有 Symbol (运行时惟一值)命名对象成员 |
异步函数先记下要作什么(传入的参数、回调函数)并交给 JS 引擎所在运行时平台的其它线程,而后立马返回,让 JS 自身线程继续执行完后面的同步代码,再按异步任务完成的顺序,一一用相应结果数据调用回调函数。
全部的异步任务内部都基于回调函数实现:
function asyncFunc(callback) {
setTimeout(callback, 1000);
}
asyncFunc(function () {
console.log('See you later')
});
复制代码
但须要回调函数的不必定是异步任务:
function syncFunc(callback) {
console.log('See you ' + callback());
}
syncFunc(function () {
return 'now';
});复制代码