轉載自水歌部落格,方便學習,順便前排觀望大佬!
JavaScript 是一門原生支援函數語言程式設計正規化的、基於原型的物件導向語言,也是一門弱型別動態指令碼語言
What’s this ?
JavaScript 函式的
this
是由函式呼叫者在呼叫前確定的 —— 繼承自 LISP 語言
用 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 寫的公共庫需要回撥函式時,也是庫內部呼叫時如上手動指定的。
閉包
通俗解釋:
孩子靠著自創資產和自己可掌控的父母遺產,繼續活下去
技術解釋:
區域性作用域中建立的函式,若引用了其上級作用域中的變(常)量,又在上級作用域外有引用,上級作用域執行結束被銷燬時,此函式及其引用的資料形成一個不被銷燬的閉包。
—— 繼承自 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';
});複製程式碼