国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript:面試頻繁出現(xiàn)的幾個(gè)易錯(cuò)點(diǎn)

VincentFF / 2786人閱讀

摘要:針對(duì)于面向?qū)ο缶幊痰摹R驗(yàn)槊嫦驅(qū)ο缶褪轻槍?duì)對(duì)象例子中的守候來進(jìn)行執(zhí)行某些動(dòng)作。這就是閉包的用途之一延續(xù)變量周期。把變量放在閉包里面和放在全局變量里面,影響是一致的。

1.前言

這段時(shí)間,金三銀四,很多人面試,很多人分享面試題。在前段時(shí)間,我也臨時(shí)擔(dān)任面試官,為了大概了解面試者的水平,我也寫了一份題目,面試了幾個(gè)前端開發(fā)者。在這段時(shí)間里面,我在學(xué),在寫設(shè)計(jì)模式的一些知識(shí),想不到的設(shè)計(jì)模式的這些知識(shí),就是面試題里面,頻繁讓人掉坑的考點(diǎn)。所以,今天就總結(jié)一下,那些讓人掉坑的考點(diǎn)。

2.面向?qū)ο缶幊?/b>
關(guān)于面向?qū)ο蠛兔嫦蜻^程,個(gè)人覺得這兩者不是絕對(duì)獨(dú)立的,而是相互相成的關(guān)系。至于什么時(shí)候用面向?qū)ο螅裁磿r(shí)候用面向過程,具體情況,具體分析。

針對(duì)于面向?qū)ο缶幊痰摹V跎嫌幸粋€(gè)高贊回答:

面向?qū)ο螅? 狗.吃(屎)
面向過程: 吃.(狗,屎)

但是這個(gè)例子覺得不太優(yōu)雅,我改一下了,舉一個(gè)優(yōu)雅些的小例子說明一下面向?qū)ο蠛兔嫦蜻^程的區(qū)別。

需求:定義‘守候吃火鍋

面向?qū)ο蟮乃枷胧牵?strong>守候.動(dòng)作(吃火鍋)

面向過程的思想是:動(dòng)作(守候,吃火鍋)

代碼實(shí)現(xiàn)方面:

//面向?qū)ο?//定義人(姓名)
let People=function(name){
    this.name=name;
}
//動(dòng)作
People.prototype={
    eat:function(someThing){
        console.log(`${this.name}吃${someThing}`);
    }
}
//守候是個(gè)人,所以要?jiǎng)?chuàng)建一個(gè)人(new一次People)
let shouhou=new People("守候","男",24);
shouhou.eat("火鍋");

//面向過程
let eat=function(who,someThing){
    console.log(`${who}吃${someThing}`);
}
eat("守候","火鍋");

結(jié)果都一樣,都是輸出‘守候吃火鍋’。但是萬一我現(xiàn)在吃飽了,準(zhǔn)備寫代碼了。這下怎么實(shí)現(xiàn)呢?看代碼

//面向?qū)ο?shouhou.coding=function(){
    console.log(this.name+"寫代碼");
}
shouhou.coding();
//面向過程
let coding=function(who){
    console.log(who+"寫代碼");
}
coding("守候");

結(jié)果也一樣:‘守候?qū)懘a’

但是不難發(fā)現(xiàn)面向?qū)ο蟾拥撵`活,復(fù)用性和擴(kuò)展性更加。因?yàn)槊嫦驅(qū)ο缶褪轻槍?duì)對(duì)象(例子中的:‘守候’)來進(jìn)行執(zhí)行某些動(dòng)作。這些動(dòng)作可以自定義擴(kuò)展。
而面向過程是定義很多的動(dòng)作,來指定誰來執(zhí)行這個(gè)動(dòng)作。

好了,面向?qū)ο蟮暮唵握f明就到這里了,至于面向?qū)ο蟮娜筇匦裕豪^承,封裝,多態(tài)這個(gè)自行上網(wǎng)查找資料。

3.this

使用 JavaScript 開發(fā)的時(shí)候,很多開發(fā)者多多少少會(huì)被 this 的指向搞蒙圈,但是實(shí)際上,關(guān)于 this 的指向,記住最核心的一句話:哪個(gè)對(duì)象調(diào)用函數(shù),函數(shù)里面的this指向哪個(gè)對(duì)象。

下面分幾種情況談?wù)撓?/p> 3-1.普通函數(shù)調(diào)用

這個(gè)情況沒特殊意外,就是指向全局對(duì)象-window。

let username="守候"
function fn(){
    alert(this.username);//undefined
}
fn();

可能大家會(huì)困惑,為什么不是輸出守候,但是在細(xì)看一看,我聲明的方式是let,不會(huì)是window對(duì)象
如果輸出守候,要這樣寫

var username="守候"
function fn(){
    alert(this.username);//守候
}
fn();
//---------------
window.username="守候"
function fn(){
    alert(this.username);//守候
}
fn();
3-2.對(duì)象函數(shù)調(diào)用

這個(gè)相信不難理解,就是那個(gè)函數(shù)調(diào)用,this指向哪里

window.b=2222
let obj={
    a:111,
    fn:function(){
        alert(this.a);//111
        alert(this.b);//undefined
    }
}
obj.fn();

很明顯,第一次就是輸出obj.a,就是111。而第二次,obj沒有b這個(gè)屬性,所以輸出undefined,因?yàn)?b>this指向obj

但是下面這個(gè)情況得注意

let obj1={
    a:222
};
let obj2={
    a:111,
    fn:function(){
        alert(this.a);
    }
}
obj1.fn=obj2.fn;
obj1.fn();//222

這個(gè)相信也不難理解,雖然obj1.fn是從obj2.fn賦值而來,但是調(diào)用函數(shù)的是obj1,所以this指向obj1

3-3.構(gòu)造函數(shù)調(diào)用
let TestClass=function(){
    this.name="111";
}
let subClass=new TestClass();
subClass.name="守候";
console.log(subClass.name);//守候
let subClass1=new TestClass();
console.log(subClass1.name)//111

這個(gè)也是不難理解,回憶下(new的四個(gè)步驟)就差不多了!

但是有一個(gè)坑,雖然一般不會(huì)出現(xiàn),但是有必要提一下。

在構(gòu)造函數(shù)里面返回一個(gè)對(duì)象,會(huì)直接返回這個(gè)對(duì)象,而不是執(zhí)行構(gòu)造函數(shù)后創(chuàng)建的對(duì)象

3-4.apply和call調(diào)用

apply和call簡單來說就是會(huì)改變傳入函數(shù)的this。

let obj1={
    a:222
};
let obj2={
    a:111,
    fn:function(){
        alert(this.a);
    }
}
obj2.fn.call(obj1);

此時(shí)雖然是 obj2 調(diào)用方法,但是使用 了call,動(dòng)態(tài)的把 this 指向到 obj1。相當(dāng)于這個(gè) obj2.fn 這個(gè)執(zhí)行環(huán)境是 obj1applycall 詳細(xì)內(nèi)容在下面提及。

3-5.箭頭函數(shù)調(diào)用

首先不得不說,ES6 提供了箭頭函數(shù),增加了我們的開發(fā)效率,但是在箭頭函數(shù)里面,沒有 this ,箭頭函數(shù)里面的 this 是繼承外面的環(huán)境。

一個(gè)例子

let obj={
    a:222,
    fn:function(){    
        setTimeout(function(){console.log(this.a)})
    }
};
obj.fn();//undefined

不難發(fā)現(xiàn),雖然 fn() 里面的 this 是指向 obj ,但是,傳給 setTimeout 的是普通函數(shù), this 指向是 windowwindow 下面沒有 a ,所以這里輸出 undefined

換成箭頭函數(shù)

let obj={
    a:222,
    fn:function(){    
        setTimeout(()=>{console.log(this.a)});
    }
};
obj.fn();//222

這次輸出 222 是因?yàn)椋瑐鹘o setTimeout 的是箭頭函數(shù),然后箭頭函數(shù)里面沒有 this ,所以要向上層作用域查找,在這個(gè)例子上, setTimeout 的上層作用域是 fn。而 fn 里面的 this 指向 obj ,所以 setTimeout 里面的箭頭函數(shù)的 this ,指向 obj 。所以輸出 222

4.call和apply

callapply 的作用,完全一樣,唯一的區(qū)別就是在參數(shù)上面。
call 接收的參數(shù)不固定,第一個(gè)參數(shù)是函數(shù)體內(nèi) this 的指向,第二個(gè)參數(shù)以下是依次傳入的參數(shù)。
apply接收兩個(gè)參數(shù),第一個(gè)參數(shù)也是函數(shù)體內(nèi) this 的指向。第二個(gè)參數(shù)是一個(gè)集合對(duì)象(數(shù)組或者類數(shù)組)

let fn=function(a,b,c){
console.log(a,b,c);
}
let arr=[1,2,3];

如上面這個(gè)例子

let obj1={
    a:222
};
let obj2={
    a:111,
    fn:function(){
        alert(this.a);
    }
}
obj2.fn.call(obj1);

callapply 兩個(gè)主要用途就是

1.改變 this 的指向(把 thisobj2 指向到 obj1

2.方法借用( obj1 沒有 fn ,只是借用 obj2 方法)

5.閉包

閉包這個(gè)可能大家是迷糊,但是必須要征服的概念!下面用一個(gè)例子簡單說下

let add=(function(){
let now=0;
return {
 doAdd:function(){
    now++;
    console.log(now);
}
}
})()

然后執(zhí)行幾次!

上圖結(jié)果看到,now 這個(gè)變量,并沒有隨著函數(shù)的執(zhí)行完畢而被回收,而是繼續(xù)保存在內(nèi)存里面。
具體原因說下:剛開始進(jìn)來,因?yàn)槭亲詣?dòng)執(zhí)行函數(shù),一開始進(jìn)來會(huì)自動(dòng)執(zhí)行,這一塊

然后把這個(gè)對(duì)象賦值給 add 。由于 add 里面有函數(shù)是依賴于 now 這個(gè)變量。所以 now 不會(huì)被銷毀,回收。這就是閉包的用途之一(延續(xù)變量周期)。由于 now 在外面訪問不到,這就是閉包的另一個(gè)用途(創(chuàng)建局部變量,保護(hù)局部變量不會(huì)被訪問和修改)。

可能有人會(huì)有疑問,閉包會(huì)造成內(nèi)存泄漏。但是大家想下,上面的例子,如果不用閉包,就要用全局變量。把變量放在閉包里面和放在全局變量里面,影響是一致的。使用閉包又可以減少全局變量,所以上面的例子閉包更好!
6.小結(jié)

在學(xué)設(shè)計(jì)模式的時(shí)候,遇到的知識(shí)點(diǎn)就是這一些了,這些知識(shí)點(diǎn),也是我在群聊,社區(qū)里面,讓人掉坑比較多的考點(diǎn)。這些知識(shí),可以說是開發(fā)常用,面試常考的知識(shí),還是建議大家深入些學(xué)習(xí)。上面那里也是簡單的過一下而已。不算深入。如果大家對(duì)文章有什么建議,歡迎指點(diǎn)。

-------------------------華麗的分割線--------------------
想了解更多,關(guān)注關(guān)注我的微信公眾號(hào):守候書閣

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/93704.html

相關(guān)文章

  • 自己寫的面試題,自己想的答案

    摘要:因?yàn)轭}目是我自己寫的,并不是網(wǎng)上摘的,所以知識(shí)點(diǎn)比較基礎(chǔ),也不全面。即使是面試題,也有人掉坑。小結(jié)面試題就是這道,我自己的解決方案也說完了。 大家都知道‘不忘初心,方得始終’,但多少人知道‘初心易得,始終難守’。時(shí)代在變化,技術(shù)在發(fā)展,基礎(chǔ)沒變。學(xué)習(xí)新技術(shù)的時(shí)候,不應(yīng)把基礎(chǔ)落下。 1.前言 因?yàn)闄C(jī)緣巧合,讓當(dāng)了無數(shù)次面試者的我,當(dāng)上了面試官,也和幾個(gè)面試者交流過。既然要應(yīng)對(duì)面試者,我就...

    CatalpaFlat 評(píng)論0 收藏0
  • 自己寫的面試題,自己想的答案

    摘要:因?yàn)轭}目是我自己寫的,并不是網(wǎng)上摘的,所以知識(shí)點(diǎn)比較基礎(chǔ),也不全面。即使是面試題,也有人掉坑。小結(jié)面試題就是這道,我自己的解決方案也說完了。 大家都知道‘不忘初心,方得始終’,但多少人知道‘初心易得,始終難守’。時(shí)代在變化,技術(shù)在發(fā)展,基礎(chǔ)沒變。學(xué)習(xí)新技術(shù)的時(shí)候,不應(yīng)把基礎(chǔ)落下。 1.前言 因?yàn)闄C(jī)緣巧合,讓當(dāng)了無數(shù)次面試者的我,當(dāng)上了面試官,也和幾個(gè)面試者交流過。既然要應(yīng)對(duì)面試者,我就...

    sherlock221 評(píng)論0 收藏0
  • 自己寫的面試題,自己想的答案

    摘要:因?yàn)轭}目是我自己寫的,并不是網(wǎng)上摘的,所以知識(shí)點(diǎn)比較基礎(chǔ),也不全面。即使是面試題,也有人掉坑。小結(jié)面試題就是這道,我自己的解決方案也說完了。 大家都知道‘不忘初心,方得始終’,但多少人知道‘初心易得,始終難守’。時(shí)代在變化,技術(shù)在發(fā)展,基礎(chǔ)沒變。學(xué)習(xí)新技術(shù)的時(shí)候,不應(yīng)把基礎(chǔ)落下。 1.前言 因?yàn)闄C(jī)緣巧合,讓當(dāng)了無數(shù)次面試者的我,當(dāng)上了面試官,也和幾個(gè)面試者交流過。既然要應(yīng)對(duì)面試者,我就...

    SimpleTriangle 評(píng)論0 收藏0
  • forEach、map、filter、find、sort、some等易錯(cuò)點(diǎn)整理

    摘要:最近手頭上做了一個(gè)很大的后臺(tái)管理項(xiàng)目,前端對(duì)復(fù)雜數(shù)據(jù)的處理要求頗高,也確實(shí)讓自己發(fā)現(xiàn)了很多之前被忽視的細(xì)節(jié)。鳴人佐助卡卡西佐助佐助佐助但是很遺憾及更早版本也不支持。 ??最近手頭上做了一個(gè)很大的后臺(tái)管理項(xiàng)目,前端對(duì)復(fù)雜數(shù)據(jù)的處理要求頗高,也確實(shí)讓自己發(fā)現(xiàn)了很多之前被忽視的細(xì)節(jié)。在此特整理出來,希望不熟悉的朋友們們以后可以繞開我踩的這些坑。本文初衷在于幫助大家梳理一些數(shù)組操作上的重點(diǎn)和易...

    AJie 評(píng)論0 收藏0
  • docker命令易錯(cuò)點(diǎn)整理

    摘要:拷貝目錄的話,是拷貝目錄里頭的文件,不包括目錄本身原樣拷貝,不支持遠(yuǎn)程文件設(shè)置指令只能存在一個(gè),多個(gè)的話,執(zhí)行最后的那一個(gè)。設(shè)置鏡像的元屬性指定被其他鏡像作為基礎(chǔ)鏡像時(shí)運(yùn)行的操作指令指定確保服務(wù)出現(xiàn)任何問題而意外結(jié)束時(shí),自動(dòng)重新啟動(dòng)。 pause docker pause可以暫時(shí)停止容器,以釋放一部分CPU出來給其他服務(wù)使用docker unpause可以解凍 docker stop ...

    YacaToy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<