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

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

arguments --- 一般用于參數(shù)的個數(shù)的判斷
JavaScript還有一個免費贈送的關(guān)鍵字arguments,它只在函數(shù)內(nèi)部起作用,并且永遠指向當前函數(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ù),有沒有更好的方法?

++當我們要使用很多個參數(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ù)定義有個特點,它會先掃描整個函數(shù)體的語句,把所有申明的變量“提升”到函數(shù)頂部:


'use strict';

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

foo();
  • 全局作用域

不在任何函數(shù)內(nèi)定義的變量就具有全局作用域。實際上,JavaScript默認有一個全局對象window,全局作用域的變量實際上被綁定到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ù)的定義也被視為一個全局變量,并綁定到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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 函數(shù)就是最基本的一種代碼抽象的方式。 定義函數(shù)function abs(x) {if (x >=0){return...
    _我和你一樣閱讀 458評論 0 0
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,268評論 0 4
  • 第一章: JS簡介 從當初簡單的語言,變成了現(xiàn)在能夠處理復(fù)雜計算和交互,擁有閉包、匿名函數(shù), 甚至元編程等...
    LaBaby_閱讀 1,697評論 0 6
  • 1. 當用戶已經(jīng)沉浸在你的App場景中,無論是何種需求需要使用到查收短信功能, 都可以在文案上有這類別出心裁的小設(shè)...
    鄭義同學閱讀 2,637評論 0 2
  • 不是我們看到了希望才去堅持,而是我們堅持了才看到希望。 昨天在朋友圈發(fā)了一條關(guān)于“面”的動態(tài),大體是激動于學校餐廳...
    周公子ZGZ閱讀 1,775評論 0 4