js疑難雜癥

JS的類型

1.基本類型有: String齿椅、Number、Boolean启泣、Undefined涣脚、Null
2.復(fù)雜類型有:Function、RegExp寥茫、Array遣蚀、Object、Date纱耻、Error
3.全局?jǐn)?shù)據(jù)類型:Math

JS閉包

閉包簡(jiǎn)單的說(shuō)就是一個(gè)函數(shù)能訪問(wèn)外部函數(shù)的變量芭梯,這就是閉包,比如說(shuō):

function a(x){
       var str=3;
      function b(y){
          console.log(x+y+str);
     }
}

要理解閉包弄喘,首先必須理解Javascript特殊的變量作用域玖喘。變量的作用域無(wú)非就是兩種: 全局變量和局部變量;js中的特殊就在于它們兩個(gè)內(nèi)部的函數(shù)是可以訪問(wèn)外部全局變量的限次,但是外部是無(wú)法訪問(wèn)函數(shù)內(nèi)的局部變量的比如:

//訪問(wèn)外部函數(shù)
var str = 123;
function test(){
  console.log(str)
}
test()//結(jié)果為 123
-----------
//訪問(wèn)內(nèi)部函數(shù)
function test2(){
  var str2 = 234
}
test2();
console.log(str2)//報(bào)錯(cuò)‘str2 is not defined’

注意 :在訪問(wèn)內(nèi)部函數(shù)的時(shí)候 如果申明變量沒(méi)有使用 var 或者 let(ES6語(yǔ)法) 申明 ,js會(huì)認(rèn)為這是一個(gè)全局變量,所以可以直接訪問(wèn)比如:

function test3(){
  str3 = 234
}
test3();
console.log(str3)//結(jié)果為 234

現(xiàn)實(shí)中的各種需求有時(shí)候也不講道理的柴灯,可能你就真的需要去訪問(wèn)閉包里面的函數(shù)來(lái)達(dá)到你想要的效果卖漫,這時(shí)也難不住我們各路大神,比如:

function fn1(){
  var numb = 8899;
  function fn2(){
        console.log(numb)
    }
  return fn2
}
var fn3 = fn1();
fn3()

上面的函數(shù)運(yùn)行時(shí)fn3()的結(jié)果就是 8899赠群; 運(yùn)用閉包的函數(shù)特點(diǎn)羊始,可以訪問(wèn)父級(jí)函數(shù)的值, 當(dāng)運(yùn)行fn3的時(shí)候相當(dāng)于運(yùn)行了fn1查描,fn2可以直接獲取fn1的局部變量突委,然后fn1直接返回fn2的值,這樣當(dāng)運(yùn)行fn3的時(shí)候就得到了numb的值了

為什么會(huì)這樣呢冬三?原因就在于f1是f2的父函數(shù)匀油,而f2被賦給了一個(gè)全局變量,這導(dǎo)致f2始終在內(nèi)存中勾笆,而f2的存在依賴于f1敌蚜,因此f1也始終在內(nèi)存中,不會(huì)在調(diào)用結(jié)束后窝爪,被垃圾回收機(jī)制(garbage collection)回收;
參考:http://www.jb51.net/article/24101.htm
什么是閉包:
當(dāng)內(nèi)部函數(shù) 在定義它的作用域 的外部 被引用時(shí),就創(chuàng)建了該內(nèi)部函數(shù)的閉包 ,如果內(nèi)部函數(shù)引用了位于外部函數(shù)的變量,當(dāng)外部函數(shù)調(diào)用完畢后,這些變量在內(nèi)存不會(huì)被 釋放,因?yàn)殚]包需要它們.

標(biāo)志性的閉包函數(shù)題:

var  str = '全局變量';
var Fn = {
    str:'局部變量',
    getStr: function(){
      return function(){
        return this.str
      }
  }
}
console.log(Fn.getStr()())//結(jié)果為 ’全局變量‘

js函數(shù)繼承

參考鏈接:https://www.zhihu.com/question/41466747/answer/132562725
1.原型繼承
比如:

function a(name){
  this.name = name
}
a.prototype.consName = function(){
  console.log(this.name)
}
function b(age){
  this.age = age
}

 b.prototype = new a('hh')
var c = new b(12)
console.log(c.name)//結(jié)果'hh'
console.log(c.age)//結(jié)果為12
c.conName()//結(jié)果為hh

這樣b通過(guò)原型繼承了a弛车,在new b的時(shí)候,c中有個(gè)隱藏的屬性__proto__指向構(gòu)造函數(shù)的prototype對(duì)象蒲每,在這里是a對(duì)象實(shí)例纷跛,a對(duì)象里面也有一個(gè)隱藏的屬性__proto__,指向a構(gòu)造函數(shù)的prototype對(duì)象,這個(gè)對(duì)象里面又有一個(gè)__proto__指向Objectprototype

這種方式有2個(gè)缺點(diǎn)邀杏,第一個(gè)缺點(diǎn)是所有子類共享父類實(shí)例贫奠,如果某一個(gè)子類修改了父類,其他的子類在繼承的時(shí)候,會(huì)造成意想不到的后果叮阅。第二個(gè)缺點(diǎn)是在構(gòu)造子類實(shí)例的時(shí)候刁品,不能給父類傳遞參數(shù)。

2.構(gòu)造函數(shù)繼承

function a(name){
  this.name = name
}
function b(age,name){
  this.age = age;
  a.call(this,name)
}
var c = new b(12,'hha')
c.age//結(jié)果為12
c.name//結(jié)果為hha
注意浩姥,在確定需要將(call())a對(duì)象給b時(shí)挑随, b()的參數(shù)必須要帶上,否則會(huì)顯示為空,或者你訪問(wèn)一個(gè)不存在的參數(shù)會(huì)顯示未定義

采用這種方式繼承是把a(bǔ)中的屬性加到this上面勒叠,這樣name相當(dāng)于就是b的屬性兜挨。這種方法的缺點(diǎn)是父類的prototype中的函數(shù)不能復(fù)用。

js執(zhí)行順序

js中國(guó) 函數(shù)(function)的優(yōu)先級(jí)要高于var變量申明眯分;
例如:

var name = 'hello';
(function(){
  if(typeof name === 'undefined'){
    console.log('123'+name)
}else{
  console.log('234'+name)  
}
})()
結(jié)果為:234hello
var name = 'hello';
(function(){
  if(typeof name === 'undefined'){
    var name = 'world';
    console.log('123'+name)
}else{
  console.log('234'+name)  
}
})()
結(jié)果為 :123world;

注意: 一般函數(shù)內(nèi)部 使用變量會(huì)優(yōu)先使用函數(shù)內(nèi)部(相同于全局變量名稱)的局部變量拌汇,
所以情況一 沒(méi)有局部變量,自執(zhí)行函數(shù)會(huì)直接使用 全局變量 弊决,而全局變量namehello;所以結(jié)果為234hello;
情況二 自執(zhí)行函數(shù)執(zhí)行的時(shí)候 name值未申明所以 是未定義噪舀,結(jié)果為123world

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市飘诗,隨后出現(xiàn)的幾起案子与倡,更是在濱河造成了極大的恐慌,老刑警劉巖昆稿,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纺座,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡溉潭,警方通過(guò)查閱死者的電腦和手機(jī)净响,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喳瓣,“玉大人馋贤,你說(shuō)我怎么就攤上這事∥飞拢” “怎么了掸掸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蹭秋。 經(jīng)常有香客問(wèn)我扰付,道長(zhǎng),這世上最難降的妖魔是什么仁讨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任羽莺,我火速辦了婚禮,結(jié)果婚禮上洞豁,老公的妹妹穿的比我還像新娘盐固。我一直安慰自己荒给,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布刁卜。 她就那樣靜靜地躺著志电,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛔趴。 梳的紋絲不亂的頭發(fā)上挑辆,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音孝情,去河邊找鬼鱼蝉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箫荡,可吹牛的內(nèi)容都是我干的魁亦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼羔挡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洁奈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绞灼,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤利术,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后镀赌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體氯哮,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡际跪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年商佛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姆打。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡良姆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幔戏,到底是詐尸還是另有隱情玛追,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布闲延,位于F島的核電站痊剖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏垒玲。R本人自食惡果不足惜陆馁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望合愈。 院中可真熱鬧叮贩,春花似錦击狮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捺萌,卻和暖如春档冬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背互婿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工捣郊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慈参。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓呛牲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驮配。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娘扩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn),也是它的特色壮锻,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)琐旁。 一、變量...
    zock閱讀 1,075評(píng)論 2 6
  • 大家好,我是IT修真院北京分院25期的學(xué)員掰邢,一枚正直純潔善良的web前端程序員 今天給大家分享一下牺陶,修真院官網(wǎng)js...
    be684ac78b0c閱讀 272評(píng)論 0 0
  • ● 閉包基礎(chǔ) ● 閉包作用 ● 閉包經(jīng)典例子 ● 閉包應(yīng)用 ● 閉包缺點(diǎn) ● 參考資料 1、閉包基礎(chǔ) 作用域和作...
    lzyuan閱讀 937評(píng)論 0 0
  • 我先后在A、B兩家公司工作怀估,由于這兩家公司同屬一個(gè)行業(yè)狮鸭,創(chuàng)業(yè)時(shí)間差不多,且公司風(fēng)格迥異多搀,使我有極大的興趣觀察思考兩...
    Helus閱讀 929評(píng)論 0 3
  • 又是新的一年歧蕉,開(kāi)始工作的時(shí)候,每個(gè)人想必都給自己定下了很多的小目標(biāo)康铭,為了是讓自己有更多奮斗的方向惯退,但是每個(gè)人的運(yùn)勢(shì)...
    霓繁花閱讀 221評(píng)論 0 0