函數(shù)
函數(shù)的定義
第一種:
function abs(x) {
if (x>=0) {
return x;
} else {
return -x;
}
};
第二種:
var abs = function () {
if (x>=0) {
return x;
} else {
return -x;
}
};
// 最后的分號最好加上
函數(shù)的調(diào)用?
abs(10); // 正確项阴,返回 10
abs(10, 'blabla'); // 也行,第二個參數(shù)被忽略
bas(); // 也行,返回 NaN
特殊的參數(shù) arguments 和 rest
arguments
保留的關(guān)鍵字黔漂,利用 arguments 可以獲得傳入的所有參數(shù)嚷狞。常用于判斷傳入?yún)?shù)的個數(shù)夺溢。
function abs() {
if (arguments.length === 0) {
return 0;
};
var x = arguments[0];
return x >= 0 ? x:-x;
}
rest 參數(shù)
用來獲取?額外的參數(shù)甥捺,ES?6引入了 rest 參數(shù)。
function foo(a, b, ...rest) {
console.log(a);
console.log(b);
console.log(rest);
}
變量作用域
var
申明的變量是有作用域的渠旁,如果在函數(shù)體內(nèi)部申明攀例,那么作用域就是整個函數(shù)體,函數(shù)體外?無效顾腊。不同的函數(shù)體申明了同一個變量名粤铭,那么互相獨(dú)立、互不影響杂靶。Javascript 的函數(shù)在查找變量時從自身函數(shù)定義開始梆惯,從“內(nèi)?”向“外”查找。如果內(nèi)部函數(shù)定義了與外部函數(shù)重名的變量吗垮,則優(yōu)先使用內(nèi)部函數(shù)定義的變量垛吗。
不在任何函數(shù)體內(nèi)定義的變量就具有全局作用域。?Javascipt 默認(rèn)有一個全局對象
window
烁登,全局作用域的變量實(shí)際上被綁定到 window 的一個屬性怯屉。
變量提升
Javascript 的函數(shù),會先掃描整個函數(shù)體的語句,把申明的變量“提升”到函數(shù)頂部锨络。所以請先申明所有變量赌躺。
命名空間
全局變量會綁定到 window
上,不同的 Javascript 如果使用了相同的全局?變量羡儿,或者定義了相同名字的頂層函數(shù)礼患,都會造成命名沖突,并且很難被發(fā)現(xiàn)失受。
最佳實(shí)踐是:將所有的變量和函數(shù)全部綁定到一個全局?變量中讶泰,例如:
var MYAPP = {};
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
MyAPP.foo = function () {
return 'foo';
};
局部作用域
由于 Javsscript 的變量作用域是在函數(shù)內(nèi)部,所以在 for
循環(huán)中無法定義局部作用域拂到。
ES6中使用 let
關(guān)鍵字替代 var
申明一個塊級作用域的變量:
function foo() {
var sum = 0;
for (let i=0; i<100; i++) {
sum += i;
};
};
常量
'use strict';
const PI = 3.14;
函數(shù)傳參的解構(gòu)賦值
類似 python 中的 unpack,?ES6引進(jìn)的新語法码泞。
'use strict';
var [x, y, z] = ['hello', 'world', 'ES6'];
var person = {
name: 'jessun',
age: 27,
gender: 'male',
passport: 'xxxx',
address: {
city: 'shanghai',
street: 'Sanda Road',
zipcode: '200000',
}
};
var {name, addresss: {city, zip}} = person;
name; // 'jessun'
city; // 'shanghai'
zip; // undefined
// address ?不是變量兄旬,而是讓 city, zip 獲得 address 對象的屬性
address; // Uncaught ReferenceError: address is not defined
用法舉例
var x = 1, y = 2;
[x, y] = [y, x];
var {hostname: domain, pathname: path} = location;
函數(shù)的方法
在一個對象中綁定函數(shù),稱為這個對象的方法余寥。
var jessun = {
name: 'jessun',
birth: 1990,
age: function () {
var y = new Date().getFullYear();
return y - this.birth;
}
};
// this 類似 python 中的 self 關(guān)鍵字
如果?使用嵌套函數(shù)的話:
var jessun = {
name: 'jessun',
birth: 1990,
age: function () {
var that = this;
function getAgeFromBirth() {
var y = new Date().getFullYear();
return y - that.birth;
}
return getAgeFromBirth();
}
}
使用函數(shù)的 apply 方法领铐,避免 this 關(guān)鍵字報(bào)錯
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
};
var jessun = {
name: 'jessun',
birth: 1990,
?age: getAge
};
jessun.apply(jessun, []);
與 apply() 類似的方法是 call(),唯一的區(qū)別是:
apply() 把參數(shù)打包成 Array() 再傳入宋舷;
call() 把參數(shù)按順序傳入绪撵。
Math.max.apply(null, [3, 4, 5]);
Math.max.call(null, 3, 4, 5);
利用 apply(),實(shí)現(xiàn)裝飾器
'use strict';
var conut = 0;
var oldParseInt = parseInt;
window.parseInt = function () {
count += 1;
return oldParseInt.apple(null, arguments);
}