1.閉包
什么是閉包,嚴格來說要滿足四個條件
1.有函數(shù)嵌套
2.內部函數(shù)引用外部作用域的變量參數(shù)
3.返回值是函數(shù)
4.創(chuàng)建一個對象函數(shù),讓其長期駐留
閉包的應用:可以實現(xiàn)數(shù)據的私有
let count = 0;
function add(){
count++
console.log(count)
}
add()
//但是整個count是全局變量,很容易被修改
function fn(){
let count = 0;
function fb(){
count++
console.log(count)
}
return fb
}
let result = fn() //完成這一句才算是閉包
result() //1
result() //2
//實現(xiàn)了數(shù)據私有,無法直接修改count
2.事件循環(huán)
1.js是單線程,防止代碼阻塞,我們把代碼(任務):同步和異步
2.同步代碼給js引擎執(zhí)行,異步代碼交給宿主環(huán)境
3.同步代碼放入執(zhí)行棧中,異步代碼等待時機成熟送入任務隊列排隊
4.執(zhí)行棧執(zhí)行完畢,回去任務隊列看是否有異步任務,有就送到執(zhí)行棧執(zhí)行,反復循環(huán)查看執(zhí)行,這個過程是事件循環(huán)。
3. 宏任務和微任務
js把異步任務分為宏任務和微任務
1.同步代碼(js執(zhí)行棧/回調棧)
2.微任務的異步代碼(js引擎)
process.nextTick
Promise.then catch() Promise本身同步,then/catch的回調函數(shù)是異步中的微任務
Async/Await
Object.observe等等
3.宏任務的異步代碼(宿主環(huán)境)
script(代碼塊)
setTimeout / setInterval 定時器
setImmediate 定時器
3.原型和原型鏈
原型:每個函數(shù)都有prototype屬性稱之為原型
因為這個屬性的值是個對象,也稱為原型對象
作用:
1.存放一些屬性和方法
2.在javasscipt中實現(xiàn)繼承
const arr = new Array(1,2,3)
arr.reverse()
console.log(arr.__protp__ === Array.prototype) //true
Array.prototype 原型 中有reverse 方法
構造函數(shù)Array
實例arr
原型鏈:對象都有__proto__屬性,這個屬性指向它的原型對象,原型對象也是對象,也有__proto__屬性,指向原型對象的原型對象,這樣一層一層形成的鏈式結構稱為原型鏈,最頂層找不到則返回null
4.如何判斷兩個對象相等
2.Object.keys()
function areObjectsEqual(obj1, obj2) {
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) {
return false;
}
for (let key of keys1) {
if (obj1[key] !== obj2[key]) {
return false;
}
}
return true;
}
const obj1 = { name: 'Alice', age: 25 };
const obj2 = { name: 'Alice', age: 25 };
const obj3 = { age: 25, name: 'Alice' };
console.log(areObjectsEqual(obj1, obj2)); // true
console.log(areObjectsEqual(obj1, obj3)); // false
3.ES6 Object.entries(obj).toString()
const obj = { name: 'xiaoming', age: 'seven',sex: 'man', grade: 'four' };
const obj2 = { name: 'xiaoming', age: 'seven',sex: 'man', grade: 'four' };
console.log(Object.entries(obj).toString() == Object.entries(obj2).toString())
5.nextTick的原理
nextTick 是 Vue 提供的一個異步方法,用于在 DOM 更新之后執(zhí)行回調函數(shù)。它的原理是利用 JavaScript 的事件循環(huán)機制來實現(xiàn)異步執(zhí)行
6.vue的優(yōu)缺點
優(yōu)點:
- 簡單:官方文檔很清晰,比 Angular 簡單易學。
- 快速:異步批處理方式更新 DOM。
- 組合:用解耦的、可復用的組件組合你的應用程序。
- 緊湊:~18kb min+gzip,且無依賴。
- 強大:表達式 & 無需聲明依賴的可推導屬性 (computed properties)。
- 對模塊友好:可以通過 NPM、Bower 或 Duo 安裝,不強迫你所有的代碼都遵循 Angular 的各種規(guī)定,使用場景更加靈活。
缺點:
不支持IE8。
Vue.js 不支持 IE8 及其以下版本,因為 Vue.js 使用了 IE8 不能模擬的 ECMAScript 5 特性。Vue.js 支持所有兼容 ECMAScript 5 的瀏覽器。
vue是單頁面頁面,對于搜索引擎不友好,影響seo.因此不適合做公司官網。比如兩個vue路由(頁面),它的路徑是這樣的:index.html#aaa 和 index.html#bbb,但對于搜索引擎來說,都是同一個頁面,就是index.html。這樣搜索引擎就無法收錄你的頁面。
7.生命周期
1.又名:生命周期回調函數(shù)、生命周期函數(shù)、生命周期鉤子
2.是什么:vue在關鍵時刻幫我們調用的一些特殊名稱的函數(shù)
3.生命周期函數(shù)的名字不可更改,但函數(shù)的具體內容是程序員根據需求編寫的
4.生命周期函數(shù)中的this指向是vm或組件實例對象
beforeCreate 此時:無法通過vm訪問到data中的數(shù)據、methods中的方法
created 此時:可以通過vm訪問到data中的數(shù)據、methods中配置的方法
beforeMount 此時:1.頁面呈現(xiàn)的是未經Vue編譯的DOM結構 2.所有對DOM的操作,最終都不奏效
mounted 此時:1.頁面中呈現(xiàn)的是經過Vue編譯的DOM 2.對DOM的操作均有效(盡可能避免)。至此初始化過程結束,一般在此進行:開啟定時器、發(fā)送網絡請求、訂閱消息、綁定自定義事件等初始化操作
beforeUpdate 此時:數(shù)據是新的,但頁面是舊的,即:頁面尚未和數(shù)據保持同步
updated 此時:數(shù)據是新的,頁面也是新的,即:頁面和數(shù)據保持同步
beforeDestroy 此時:vm中所有的:data、methods、指令等待,都處于可用狀態(tài),馬上要執(zhí)行銷毀過程,一般在此階段:關閉定時器、取消訂閱消息、解綁自定義事件等收尾操作
destroyed
activated 路由組件被激活時觸發(fā)
deactivated 路由組件失活時觸發(fā)
nextTick
vue3中 beforeUnmount和unmounted代替beforeDestroy 和destroyed
常用的生命周期鉤子:
1.mounted/發(fā)送ajax請求、啟動定時器、綁定自定義事件、訂閱消息等【初始化操作】。
2.beforeDestroy:清除定時器、解綁自定義事件、取消訂閱消息等【收尾工作】。
8.vue組件之間通信
在Vue中,組件間通信主要有以下幾種方式:
1.父子組件通信:props / emit / v-on
3.兄弟組件通信:EventBus / Vuex
4.跨多層組件通信:EventBus / Vuex / provide / inject
5.Vuex:狀態(tài)管理,適合大型應用
vuex:vuex相關 - 簡書 (jianshu.com)
6.EventBus:創(chuàng)建一個事件中心,用on監(jiān)聽事件
7.provide / inject:父組件提供數(shù)據,子組件注入數(shù)據,無需props和事件
9.less 在vue項目中如何全局引入
vue3.0配置less并使用全局變量_less全局變量如何引用-CSDN博客