1-JavaScript-函數(shù)和作用域

  • 1 arguments 函數(shù)可以作為一個變量

arguments --- 一般用于參數(shù)的個數(shù)的判斷
JavaScript還有一個免費(fèi)贈送的關(guān)鍵字arguments玷过,它只在函數(shù)內(nèi)部起作用宝与,并且永遠(yuǎn)指向當(dāng)前函數(shù)的調(diào)用者傳入的所有參數(shù)。arguments類似Array但它不是一個Array:

function foo(x) {
    alert(x); // 10
    for (var i=0; i<arguments.length; i++) {
        alert(arguments[i]); // 10, 20, 30
    }
}
foo(10, 20, 30);
  • 2 rest (rest和arguments都是可以看作array數(shù)組)

為了獲取除了已定義參數(shù)a冶匹、b之外的參數(shù)习劫,我們不得不用arguments,并且循環(huán)要從索引2開始以便排除前兩個參數(shù)嚼隘,這種寫法很別扭诽里,只是為了獲得額外的rest參數(shù),有沒有更好的方法飞蛹?

++當(dāng)我們要使用很多個參數(shù)的時候使用rest谤狡,比如sum多個數(shù)求和++

function foo(a, b) {
  var i, rest = [];
  if (arguments.length > 2) {
      for (i = 2; i<arguments.length; i++) {
          rest.push(arguments[i]);
      }
  }
  console.log('a = ' + a);
  console.log('b = ' + b);
  console.log(rest);
}
foo(10,20)
  • 測試rest使用方法

    function sum(...rest) {
    var sum=0;
       for(var i in rest){
        sum = rest[i] + sum; 
    }
    return sum;
    }
    // 測試:
    var i, args = [];
    for (i=1; i<=100; i++) {
        args.push(i);
    }
    if (sum() !== 0) {
        alert('測試失敗: sum() = ' + sum());
    } else if (sum(1) !== 1) {
        alert('測試失敗: sum(1) = ' + sum(1));
    } else if (sum(2, 3) !== 5) {
        alert('測試失敗: sum(2, 3) = ' + sum(2, 3));
    } else if (sum.apply(null, args) !== 5050) {
        alert('測試失敗: sum(1, 2, 3, ..., 100) = ' + sum.apply(null, args));
    } else {
        alert('測試通過!');
    }
    
  • 另外一個測試

    'use strict';
    
    function area_of_circle(r, pi) {
    
        return (arguments.length===2)? pi*r*r : 3.14*r*r;
    
    }
    // 測試:
    if (area_of_circle(2) === 12.56 && area_of_circle(2, 3.1416) === 12.5664) {
        alert('測試通過');
    } else {
        alert('測試失敗');
    }
  • 3 作用域

    • 變量提升

JavaScript的函數(shù)定義有個特點(diǎn),它會先掃描整個函數(shù)體的語句卧檐,把所有申明的變量“提升”到函數(shù)頂部:


'use strict';

function foo() {
    var x = 'Hello, ' + y;
    alert(x);
    var y = 'Bob';
}

foo();
  • 全局作用域

不在任何函數(shù)內(nèi)定義的變量就具有全局作用域墓懂。實(shí)際上,JavaScript默認(rèn)有一個全局對象window捕仔,全局作用域的變量實(shí)際上被綁定到window的一個屬性:

'use strict';

var course = 'Learn JavaScript';
alert(course); // 'Learn JavaScript'
alert(window.course); // 'Learn JavaScript'
因此盅粪,直接訪問全局變量course和訪問window.course是完全一樣的帆调。

你可能猜到了,由于函數(shù)定義有兩種方式,以變量方式var foo = function () {}定義的函數(shù)實(shí)際上也是一個全局變量锄禽,因此佛吓,頂層函數(shù)的定義也被視為一個全局變量淤刃,并綁定到window對象:

'use strict';

function foo() {
    alert('foo');
}

foo(); // 直接調(diào)用foo()
window.foo(); // 通過window.foo()調(diào)用
  • 4名字空間

全局變量會綁定到window上津滞,不同的JavaScript文件如果使用了相同的全局變量,或者定義了相同名字的頂層函數(shù),都會造成命名沖突隆敢,并且很難被發(fā)現(xiàn)温自。

減少沖突的一個方法是把自己的所有變量和函數(shù)全部綁定到一個全局變量中。例如:

// 唯一的全局變量MYAPP:
var MYAPP = {};

// 其他變量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;

// 其他函數(shù):
MYAPP.foo = function () {
    return 'foo';
};

把自己的代碼全部放入唯一的名字空間MYAPP中馆里,會大大減少全局變量沖突的可能复斥。
許多著名的JavaScript庫都是這么干的:jQuery,YUI被去,underscore等等臭埋。

- 使用const荣恐,let來解塊級作用域的問題
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硼被,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子医清,更是在濱河造成了極大的恐慌筒捺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孩灯,死亡現(xiàn)場離奇詭異峰档,居然都是意外死亡欢顷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灌侣,“玉大人痊乾,你說我怎么就攤上這事∈遥” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長主届。 經(jīng)常有香客問我谈截,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任臀叙,我火速辦了婚禮,結(jié)果婚禮上床嫌,老公的妹妹穿的比我還像新娘跨释。我一直安慰自己,他們只是感情好既鞠,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布煤傍。 她就那樣靜靜地躺著,像睡著了一般嘱蛋。 火紅的嫁衣襯著肌膚如雪蚯姆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天洒敏,我揣著相機(jī)與錄音龄恋,去河邊找鬼。 笑死凶伙,一個胖子當(dāng)著我的面吹牛郭毕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播函荣,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼显押,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了傻挂?” 一聲冷哼從身側(cè)響起乘碑,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎金拒,沒想到半個月后兽肤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年资铡,在試婚紗的時候發(fā)現(xiàn)自己被綠了电禀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡笤休,死狀恐怖尖飞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宛官,我是刑警寧澤葫松,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布瓦糕,位于F島的核電站底洗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咕娄。R本人自食惡果不足惜亥揖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望圣勒。 院中可真熱鬧费变,春花似錦、人聲如沸圣贸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吁峻。三九已至滑负,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間用含,已是汗流浹背矮慕。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啄骇,地道東北人痴鳄。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像缸夹,于是被迫代替她去往敵國和親痪寻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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