-
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來解塊級作用域的問題