一. 變量提升
看以下代碼, 或多或少會有些問題的.
function fn(){
console.log(name);
var name = '大馬猴';
}
fn()
發(fā)現(xiàn)問題了么. 這么寫代碼, 在其他語言里. 絕對是不允許的. 但是在js里. 不但允許, 還能執(zhí)行. 為什么呢? 因為在js執(zhí)行的時候. 它會首先檢測你的代碼. 發(fā)現(xiàn)在代碼中會有name使用. OK. 運行時就會變成這樣的邏輯:
function fn(){
var name;
console.log(name);
name = '大馬猴';
}
fn()
看到了么. 實際運行的時候和我們寫代碼的順序可能會不一樣....這種把變量提前到代碼塊第一部分運行的邏輯被稱為變量提升. 這在其他語言里是絕對沒有的. 并且也不是什么好事情. 正常的邏輯不應(yīng)該是這樣的. 那么怎么辦? 在新的ES6中. 就明確了, 這樣使用變量是不完善的. es6提出. 用let來聲明變量. 就不會出現(xiàn)該問題了.
function fn(){
console.log(name); // 直接報錯, let變量不可以變量提升.
let name = '大馬猴';
}
fn()
==結(jié)論一, 用let聲明變量是新版本javascript提倡的一種聲明變量的方案.==
let還有哪些作用呢?
function fn(){
// console.log(name); // 直接報錯, let變量不可以變量提升.
// let name = '大馬猴';
var name = "周杰倫";
var name = "王力宏";
console.log(name);
}
fn()
顯然一個變量被聲明了兩次. 這樣也是不合理的. var本意是聲明變量. 同一個東西. 被聲明兩次. 所以ES6規(guī)定. let聲明的變量. 在同一個作用域內(nèi). 只能聲明一次.
function fn(){
// console.log(name); // 直接報錯, let變量不可以變量提升.
// let name = '大馬猴';
let name = "周杰倫";
console.log(name);
let name = "王力宏";
console.log(name);
}
fn()
注意, 報錯是發(fā)生在代碼檢查階段. 所以. 上述代碼根本就執(zhí)行不了.
==結(jié)論二, 在同一個作用域內(nèi). let聲明的變量只能聲明一次. 其他使用上和var沒有差別==
二. 閉包函數(shù)(難)
2.1 定時器
setTimeout(函數(shù)名, 時間(毫秒),表示多長時間后運行此函數(shù)荸实,注意:函數(shù)名不要帶括號僚稿。
function fn(){
console.log('測試定時器')
}
setTimeout(fn, 5000)
常見的用法
setTimeout(function (){
console.log('我是一個匿名函數(shù)')
}, 3000)
setInterval 每隔多長時間運行一次灰粮,會一直運行立砸;使用場景:每隔多長時間重新設(shè)置一下cookie
setInterval(function (){
console.log('每隔一秒鐘運行一次')
}, 1000)
在瀏覽器的控制臺上可以輸入window.clearInterval(s)
索赏,讓setInterval 代碼停止運行
let s= setInterval(function (){
console.log('每隔一秒鐘運行一次')
}, 1000)
window.clearInterval(s)
2.2 時間
先擴展一個軟件測試時的問題:
有時候久窟,前端發(fā)布版本了尉尾,但是在瀏覽器上看到頁面沒有更新(還是舊版本的內(nèi)容介蛉,而不是新版本的)萌庆,但是前端的開發(fā)經(jīng)過檢查后,堅定是版本已經(jīng)發(fā)布了币旧。既然前端已經(jīng)發(fā)布了新版本践险,那么頁面的內(nèi)容應(yīng)該是新的才對,而為什么頁面內(nèi)容還是舊的呢?原因在于:瀏覽器對同一個URL訪問的時候巍虫,會進行緩存彭则,因為前不久訪問了這個url,離現(xiàn)在返回的時間不長占遥,瀏覽器對前面的內(nèi)容進行緩存了俯抖,直接展示出來,而沒有去獲取最新的資源瓦胎。
為了解決這個問題芬萍,可以在url后面添加一些變化的參數(shù)來確保每次訪問的url是不一樣的,這樣瀏覽器就不會緩存了搔啊,問題來了担忧,這個是要根據(jù)網(wǎng)頁內(nèi)容的需求來做的,比如一些業(yè)務(wù)要實時更新內(nèi)容坯癣,如:訂單頁面瓶盛,購物車頁面等等。對于一些不是那么經(jīng)常要更新內(nèi)容的頁面示罗,即不需要多添加這些變化的參數(shù)惩猫,一是這樣可以減少服務(wù)器訪問的壓力,二是可以減少服務(wù)器的流量費蚜点,三是可以提高用戶體驗(快速獲取頁面內(nèi)容)減少加載時間轧房。
而這些變化的參數(shù)可以使用隨機數(shù)來實現(xiàn),而是可以使用時間戳參數(shù)绍绘。
JS中時間的運用
// 這里直接在JS文件中運行奶镶,打印出來的時間少了八小時。(通過getTime()獲取到的時間戳是對的)時區(qū)是0時區(qū)陪拘,要獲取中國的時間厂镇,要加8小時,但是在HTML中運行時間是對的左刽,問題還沒找到捺信,后續(xù)查詢一下
function time(){
let t = new Date()
console.log(t)
let yea = t.getYear() // 這個方法要加1900,輸出是122欠痴,加1900=2022(老網(wǎng)站)
// console.log(yea)
let year = t.getFullYear()
// console.log('年份',year)
let month = t.getMonth() + 1
// console.log('月份', month) //需要加1迄靠,才是當(dāng)前月份
let date = t.getDate()
// console.log('日', date)
let hour = t.getHours()
// console.log(hour)
let minute = t.getMinutes()
// console.log(minute)
let seconds = t.getSeconds()
// console.log(seconds)
format_date = year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + seconds;
console.log(format_date)
}
setInterval(time, 1000)
要注意
1、在逆向的時候喇辽,如果看到一個東西 + 1900
先要想到這個是一個時間掌挚;
2、獲取時間的時候菩咨,可以不加小括號let d=new Date
JS中的時間戳
單位是:毫秒吠式,13位數(shù)字
// 獲取時間戳
let d=new Date();
console.log(d.getTime())