js做用域問題
js事件處理器在線程空閒時間不會運行,致使最後運行的時候輸出的都是同一個值
1.使用閉包緩存當前值的生存週期es6
for (var i = 1; i <= 5; i++) { (function (k) { setTimeout(function () { console.log(k) }, 1000) })(i) }
2.es6屬性 聲明let會有本身的做用域數組
for (let i = 0; i < 5; i++) { setTimeout(function () { console.log(i) }, 1000) }
寫一個函數,對於一個排好序的數組,若是當中有兩個數的和爲某個給定的數target,返回true,不然false,時間複雜度O(n)緩存
function combination(arr, target) { for (var i = 0; i < arr.length - 1; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] + arr[j] === target) return true; } } return false }
/** * 題目 * @1.setTimeout(function() { console.log(1); }, 100); @2.setTimeout(function () { console.log(2); }, 0) @3.Promise.resolve(console.log(3)).then(() => { console.log(4) }) @4.async function async1(){ console.log(5) await async2() console.log(6) } @5. async function async2(){ console.log(7) } @6. async1() @7.console.log(8)
* @answer 3 5 7 8 4 6 2 1 遵循原則 :同步==》異步==》回調函數 編號@1@2是一個回調函數因此放在最後執行 編號@3做爲一個Promise對象 首先Promise的出現是由於js是單線程的一門語言,單線程只能按照順序去執行A執行完了B纔開始執行, 因此執行代碼會形成阻塞,Promise是爲了解決這個所給咱們帶來困擾問題的一種異步解決方案, 所以@3>@2>@1 編號@4 async 實際上只是 Generator 函數的語法糖 async函數就是將 Generator 函數的星號(*)替換成async 僅此而已 async函數返回一個 Promise 對象 await(等待) await命令後面的 Promise 對象執行完,纔會發生狀態改變 因此@4 能夠直接打印出5 可是必須等待 async2的完成才能夠打印6 因此此時的順序是@3(then是結果此時是異步操做)@6>>@7@5>@2>@1 所以結果是 : 3 5 7 8 4 6 2 1
touchstart : 觸摸開始(手指放在觸摸屏上)
touchmove : 拖動(手指在觸摸屏上移動)
touchend : 觸摸結束(手指從觸摸屏上移開)閉包
class touchEvent { constructor(target, away) { this.dom = target; this.away = away; } getDom() { document.querySelector(this.dom).addEventListener(this.away, this.touchStart) } touchStart = (e) => { /** * 記錄起始點 */ // 觸摸開始 document.querySelector(this.dom).addEventListener('touchmove', this.touchMove) } touchMove = (e) => { // 觸摸中 document.querySelector(this.dom).addEventListener('touchend', this.touchEnd) } touchEnd = (e) => { // 觸摸結束 } } new touchEvent('#swiper', 'touchstart').getDom();