【Javascript】作用域及引用類型


立即執(zhí)行函數(shù)表達(dá)式是什么的圆?有什么作用榄攀?

立即執(zhí)行函數(shù)表達(dá)式

即執(zhí)行函數(shù)(Immediate Functions)
立即執(zhí)行函數(shù)模式是一種語法掘托,可以讓你的函數(shù)在定義后立即被執(zhí)行,這種模式本質(zhì)上就是函數(shù)表達(dá)式(命名的或者匿名的)畦戒,在創(chuàng)建后立即執(zhí)行

立即執(zhí)行函數(shù)表達(dá)式的作用

Javascript中沒有私有作用域的概念方库,如果在多人開發(fā)的項目上,你在全局或局部作用域中聲明了一些變量障斋,可能會被其他人不小心用同名的變量給覆蓋
根據(jù)javascript函數(shù)作用域鏈的特性纵潦,可以使用這種方式可以模仿一個私有作用域,用匿名函數(shù)作為一個“容器”垃环,“容器”內(nèi)部可以訪問外部的變量邀层,而外部環(huán)境不能訪問“容器”內(nèi)部的變量,所以( function(){…} )()內(nèi)部定義的變量不會和外部的變量發(fā)生沖突遂庄,俗稱“匿名包裹器”或“命名空間”寥院。


求n!,用遞歸來實現(xiàn)

function factorial(n){
  if(n === 1 || n === 0){
    return 1
  }
    else{
      return n * factorial(n - 1)
    }
}
factorial(n)輸出即可
// 鑒于'0! === 1' ,所以if中加入了'n === 0'的條件以應(yīng)對當(dāng)輸入?yún)?shù)為0的時候

以下代碼輸出什么涛目?

function getInfo(name, age, sex){
        console.log('name:',name);
        console.log('age:', age);
        console.log('sex:', sex);
        console.log(arguments);
        arguments[0] = 'valley';
        console.log('name', name);
    }
getInfo('饑人谷', 2, '男');輸出結(jié)果如下
name:'饑人谷'
age:2
sex:男
['饑人谷', 2, '男']
name 'valley'
getInfo('小谷', 3);輸出結(jié)果如下
name:'小谷'
age:3
sex:undefined
['小谷', 3]
name 'valley'
getInfo('男');輸出結(jié)果如下
name:'男'
age:undefined
sex:undefined
['男']
name 'valley'

寫一個函數(shù)秸谢,返回參數(shù)的平方和?

function sumOfSquares(){
  var sum = 0
  for(var i = 0; i < arguments.length; i++){
    sum += arguments[i]*arguments[i]
  }
  return sum
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result2) //10

如下代碼的輸出霹肝?為什么

console.log(a);
var a = 1;
console.log(b);

由于聲明提前估蹄,實際上的執(zhí)行順序是

var a
console.log(a);
a = 1;
console.log(b);

輸出結(jié)果為

undefined //提前聲明了a,但并沒有賦值
"error" //沒有聲明b變量
"ReferenceError: b is not defined

如下代碼的輸出沫换?為什么

sayName('world');
sayAge(10);
function sayName(name){
    console.log('hello ', name); //輸出"hello world"臭蚁,因為sayName函數(shù)聲明提前,可以正常調(diào)用
}
var sayAge = function(age){
    console.log(age); //輸出"error" "TypeError: sayAge is not a function讯赏,因為在調(diào)用sayAge時垮兑,他還不是函數(shù),還未將函數(shù)表達(dá)式賦值給sayAge
};

如下代碼輸出什么? 為什么

var x = 10
bar() 
function foo() {
  console.log(x) 
}
function bar(){
  var x = 30
  foo()
}

console.log(x)的輸出結(jié)果應(yīng)為10
因為執(zhí)行的是foo函數(shù)中的內(nèi)容待逞,所以這個x會現(xiàn)在foo的函數(shù)作用域中尋找x甥角,尋找未果,向上一層作用域?qū)ふ沂队#凑业搅藊=10,所以輸出結(jié)果為10


如下代碼輸出什么? 為什么

var x = 10;
bar() 
function bar(){
  var x = 30;
  function foo(){
    console.log(x) 
  }
  foo();
}

輸出結(jié)果為30.理由同上震束,從foo作用域找到bar作用域找到x=30


如下代碼輸出什么? 為什么

var a = 1
function fn1(){
  function fn2(){
    console.log(a)
  }
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn()

輸出為2怜庸,理由同上,console.log(a)在fn2作用域找a未果垢村,去fn1作用域找到了


如下代碼輸出什么? 為什么

var a = 1
function fn1(){
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
function fn2(){
  console.log(a)
}
var fn = fn1()
fn()

輸出結(jié)果為1割疾,同上,console.log(a)先從fn2里面找a未果嘉栓,去上一層找宏榕,全局變量a=1拓诸,所以輸出1


如下代碼輸出什么? 為什么

var a = 1
function fn1() {
    function fn3() {
        function fn2() {
            console.log(a)
        }
        fn2()
        var a = 4
    }
    var a = 2
    return fn3
}
var fn = fn1()
fn()

輸出為undefined,因為console.log(a)從fn2中找a無果麻昼,從fn3中找奠支,fn3中變量聲明提前,a首先被初始化成undefined抚芦,所以輸出為undefined


如下代碼輸出什么倍谜?為什么

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);  //false 雖然看似相同,但是在對象聲明的時候叉抡,obj12分別指向堆內(nèi)存中不同的地址尔崔,所以不同
console.log(obj1 = obj2);  // 將obj2賦值給obj1,也就是此后obj1褥民、2指向堆內(nèi)存中同一個地址
console.log(obj1 == obj2); //true 由上得出應(yīng)為true

如下代碼輸出什么? 為什么

var a = 1
var c = { name: 'jirengu', age: 2 }

function f1(n){
  ++n
}
function f2(obj){
  ++obj.age
}
f1(a) 
f2(c) 
f1(c.age) 
console.log(a) // 1 因為沒有賦值操作季春,++a只是在f1函數(shù)作用域內(nèi)自增,不會影響到外部的全局變量a
console.log(c) // name: 'jirengu', age: 3 因為f2中的c是引用類型消返,會對c中的age進(jìn)行自增鹤盒,而f1(c.age)中的age是幾本類型,不會影響外層c

寫一個深拷貝函數(shù)

函數(shù)體:

// 其實是照葫蘆畫瓢..自己理解的還很有限
function deepClone(oldObj) {
        var newObj = {}
        for(var key in oldObj) {
            if(typeof oldObj[key] === 'object') {
                newObj[key] = deepClone(oldObj[key])
            }else{
                newObj[key] = oldObj[key]
            }
        }
        return newObj
    }
var a = {
  name: 'NinthG',
  sex: 'male',
  age: 26,
  wife: {
    name: 'baobao', 
    age: 26
          }
}
var b = deepClone(a)
console.log(a === b)
a.wife.age = 25
console.log(a)
console.log(b)

輸出結(jié)果

false //深拷貝成功侦副,即a !== b
[object Object] {
  age: 26,
  name: "NinthG",
  sex: "male",
  wife: [object Object] {
    age: 25, //將25賦值給a.wife.age來改變a
    name: "baobao"
  }
}
[object Object] {
  age: 26,
  name: "NinthG",
  sex: "male",
  wife: [object Object] {
    age: 26, //b沒有受到a.wife.age重新賦值的影響侦锯,拷貝成功
    name: "baobao"
  }
}

參考文章

深入理解javascript中的立即執(zhí)行函數(shù)|腳本之家
【js基礎(chǔ)】深淺拷貝——李佳怡的紙糊|知乎

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秦驯,隨后出現(xiàn)的幾起案子尺碰,更是在濱河造成了極大的恐慌,老刑警劉巖译隘,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亲桥,死亡現(xiàn)場離奇詭異,居然都是意外死亡固耘,警方通過查閱死者的電腦和手機(jī)题篷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厅目,“玉大人番枚,你說我怎么就攤上這事∷鸱螅” “怎么了葫笼?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拗馒。 經(jīng)常有香客問我路星,道長,這世上最難降的妖魔是什么诱桂? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任洋丐,我火速辦了婚禮呈昔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘友绝。我一直安慰自己堤尾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布九榔。 她就那樣靜靜地躺著哀峻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哲泊。 梳的紋絲不亂的頭發(fā)上剩蟀,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音切威,去河邊找鬼育特。 笑死,一個胖子當(dāng)著我的面吹牛先朦,可吹牛的內(nèi)容都是我干的缰冤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼喳魏,長吁一口氣:“原來是場噩夢啊……” “哼棉浸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刺彩,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迷郑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后创倔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗡害,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年畦攘,在試婚紗的時候發(fā)現(xiàn)自己被綠了霸妹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡知押,死狀恐怖叹螟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朗徊,我是刑警寧澤首妖,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站爷恳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏象踊。R本人自食惡果不足惜温亲,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一棚壁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栈虚,春花似錦袖外、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粘姜,卻和暖如春鬓照,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孤紧。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工豺裆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人号显。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓臭猜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親押蚤。 傳聞我的和親對象是個殘疾皇子蔑歌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 區(qū)別: 函數(shù)聲明后面的分號可加可不加,不加也不影響接下來語句的執(zhí)行揽碘,但...
    Sheldon_Yee閱讀 401評論 0 1
  • 一、作用域 A煞烫、定義 代碼在運(yùn)行時浑此,各個變量、函數(shù)和對象的可訪問性滞详。換句話說凛俱,作用域決定了你的代碼里的變量和其他資...
    5吖閱讀 620評論 0 1
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 函數(shù)聲明 函數(shù)表達(dá)式 函數(shù)聲明:函數(shù)調(diào)用可以發(fā)生在函數(shù)聲明之前,例如下...
    TimeLesser閱讀 398評論 4 4
  • 1、立即執(zhí)行函數(shù)表達(dá)式是什么料饥?有什么作用 我們都知道蒲犬,一般定義一個函數(shù)有函數(shù)聲明和函數(shù)表達(dá)式兩種方法:functi...
    zh_yang閱讀 863評論 0 6
  • 第 1 題 立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用岸啡? 1. 立即執(zhí)行函數(shù)是什么 立即執(zhí)行函數(shù)就是 聲明一個匿名函數(shù) ...
    紅豆丁244閱讀 393評論 0 0