變量,作用域鏈,指向函數(shù)與執(zhí)行函數(shù),閉包

在學(xué)習(xí)寫輪播圖,還有學(xué)習(xí)《js高級程序設(shè)計》中的執(zhí)行環(huán)境,變量,作用域,函數(shù),閉包時所想所感
下面我主要寫的是變量的指向,變量指向的函數(shù),變量指向的函數(shù)的執(zhí)行,變量指向的函數(shù)執(zhí)行時的作用域
先寫一個超級簡單的

function fn() {
    var result = 1;
    console.log(result);
    return result;
}
var result1 = fn;
var result2 = fn();
console.log(result1,result2);
//結(jié)果
1
function fn() {
      var result = 1;
      console.log(result);
      return result;
} 1

超級簡單是吧,但是要明白這中間的過程是什么,一步步來:

  1. 定義了一個變量fn和一個函數(shù),函數(shù)的內(nèi)容是var result = 1; ...,將變量fn指向這個函數(shù)

算了還是稍微畫個圖吧
對于棧和堆還不是很了解

測試圖片

為了等下更好理解函數(shù),這里的所有變量的值都當(dāng)做引用類型,所有的變量都是指向,給變量加上()相當(dāng)與執(zhí)行變量所指向的函數(shù)
還是簡單一點的

function fn() {
    var result = [];
    for (var i=0;i<3;i++) {
        result[i] = function() {
            return i;
        }
    }
    return result;
}
var result1 = fn();
var result2 = result1[0]();
var result3 = result1[1]();
var result4 = result1[2]();
console.log(result1,result2,result3,result4);
// 結(jié)果
[function...,function...,function...] 3 3 3
  1. 將fn指向function(){var result = []...}
  2. 執(zhí)行fn所指向的function,新建result,將result指向一個Array,將result[0]指向function(){return i;},result[1]指向另一個function(){return i;},result[2]也一樣,雖然內(nèi)容一樣,不過這是不同的三個函數(shù),返回result,這時result1指向result
  3. 執(zhí)行result[0]所指向的函數(shù),返回i,但是arguments沒有,自己本身沒有定義,所以根據(jù)作用域鏈,只能在上級函數(shù)中找到,這時候函數(shù)中的語句已經(jīng)在第二步執(zhí)行完畢,i=3,所以返回了3,result2就指向3,這下重點來了,這里就算是閉包的部分了,通常來說,當(dāng)fn所指向的函數(shù)執(zhí)行完畢后會銷毀其活動對象,也就是定義的result,i等等,但是因為返回的result的詞法作用域(lexcical scope)是在定義時確定的,(先不管with和trycatch),要用到i,這時就保留了上級函數(shù)的活動對象,以便于result所指向的函數(shù)訪問,后面的兩個相同
  4. 打印出他們指向的值

再看一個

function fn() {
    var result = [];
    for (var i=0;i<3;i++) {
        result[i] = (function() {
            return i;
        })();
    }
    return result;
}
var result1 = fn();
var result2 = result1[0];
var result3 = result1[1];
var result4 = result1[2];
console.log(result1,result2,result3,result4)
// 結(jié)果
[0, 1, 2] 0 1 2

這次在result所指向的的函數(shù)后面加上了(),在result2,3,4后面取消了()

  1. 執(zhí)行fn指向的函數(shù),和上一次相同,定義函數(shù),但是立即執(zhí)行,這時result[0]就指向這個函數(shù)的的返回值,第一此循環(huán)i=1,執(zhí)行一次function(){return i;},同樣向上找到i=1,返回1,result[0]就指向1,后面的相同,然后返回result
  2. 這時候fn()就指向了在堆中的那個Array,result也就指向那個Array
  3. 打印

這下稍微難點的

function fn() {
    var result = [];
    for (var i=0;i<3;i++) {
        result[i] = (function(i) {
            return function() {
                return i;
            };
        })(i);
    }
    return result;
}
var result1 = fn();
var result2 = result1[0]();
var result3 = result1[1]();
var result4 = result1[2]();
console.log(result1,result2,result3,result4)
// 結(jié)果
[function...,function...,function...] 0 1 2
  1. 執(zhí)行fn指向的函數(shù),和上一次相同,定義函數(shù),立即執(zhí)行,這時result[0]指向函數(shù)function(){return i};
    ,result[1]指向另一個function(){return i;},result[2]同上,返回result,是不是感覺和第一次一樣,但是等下判斷i的值就不一樣了
  2. 執(zhí)行result1[0]指向的函數(shù)function(){return i;},先在自己的作用域中找,沒有,向上找,就是那個立即執(zhí)行的函數(shù)中找,arguments中有,這時的i是3嗎?顯然不是的,是立即執(zhí)行時傳入的i,因為返回的function(){return i;}在定義時傳入的0,所以這時的i為0,還記得剛才寫的,詞法作用域(lexcical scope)是在定義時確定的,return fuction(){}也可以理解為var anonymous = function(){}; return anonymous;同理后面返回1和2
  3. 打印
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榄棵,一起剝皮案震驚了整個濱河市甘磨,隨后出現(xiàn)的幾起案子阅悍,更是在濱河造成了極大的恐慌,老刑警劉巖首有,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钠右,居然都是意外死亡邪意,警方通過查閱死者的電腦和手機综芥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門丽蝎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毫痕,你說我怎么就攤上這事征峦。” “怎么了消请?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長类腮。 經(jīng)常有香客問我臊泰,道長,這世上最難降的妖魔是什么蚜枢? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任缸逃,我火速辦了婚禮,結(jié)果婚禮上厂抽,老公的妹妹穿的比我還像新娘需频。我一直安慰自己,他們只是感情好筷凤,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布昭殉。 她就那樣靜靜地躺著苞七,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挪丢。 梳的紋絲不亂的頭發(fā)上蹂风,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音乾蓬,去河邊找鬼惠啄。 笑死,一個胖子當(dāng)著我的面吹牛任内,可吹牛的內(nèi)容都是我干的撵渡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼死嗦,長吁一口氣:“原來是場噩夢啊……” “哼趋距!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起越走,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤棚品,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后廊敌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铜跑,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年骡澈,在試婚紗的時候發(fā)現(xiàn)自己被綠了锅纺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡肋殴,死狀恐怖囤锉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情护锤,我是刑警寧澤官地,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站烙懦,受9級特大地震影響驱入,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氯析,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一亏较、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掩缓,春花似錦雪情、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尘执。三九已至,卻和暖如春扁达,著一層夾襖步出監(jiān)牢的瞬間正卧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工跪解, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炉旷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓叉讥,卻偏偏與公主長得像窘行,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子图仓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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