定義方式
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
或者
var abs = function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}; //但是要注意,這里有一個(gè)分號(hào),因?yàn)檫@是一個(gè)賦值語(yǔ)句,將一個(gè)匿名函數(shù)賦給abs
arguments
函數(shù)定義后,有一個(gè)內(nèi)部的關(guān)鍵字,只在內(nèi)部起作用,并永遠(yuǎn)指向當(dāng)前函數(shù)的調(diào)用者傳入的所有參數(shù)
function foo(x) {
console.log('x = ' + x); // 10
for (var i=0; i<arguments.length; i++) {
console.log('arg ' + i + ' = ' + arguments[i]); // 10, 20, 30
}
}
foo(10, 20, 30);
利用arguments
判斷參數(shù)個(gè)數(shù),完成中間的可選參數(shù)
// foo(a[, b], c)
// 接收2~3個(gè)參數(shù)谨娜,b是可選參數(shù),如果只傳2個(gè)參數(shù)嗜浮,b默認(rèn)為null:
function foo(a, b, c) {
if (arguments.length === 2) {
// 實(shí)際拿到的參數(shù)是a和b皿曲,c為undefined
c = b; // 把b賦給c
b = null; // b變?yōu)槟J(rèn)值
}
// ...
}
rest
和arguments 類似,但是直接指向多余的變量,并以數(shù)組形式給出.
rest
參數(shù)只能寫在最后,前面用...
標(biāo)識(shí)
function sum(...rest) {
}
作用域
內(nèi)部函數(shù)可以訪問(wèn)外部函數(shù)定義的變量粤铭,反過(guò)來(lái)則不行
變量提升
它會(huì)先掃描整個(gè)函數(shù)體的語(yǔ)句挖胃,把所有申明的變量“提升”到函數(shù)頂部:
會(huì)提升變量的聲明,但是不會(huì)提升變量的賦值
全局作用域
JavaScript默認(rèn)有一個(gè)全局對(duì)象window
頂層函數(shù)也視為全局變量,并綁定到window
名字空間
減少?zèng)_突的一個(gè)方法是把自己的所有變量和函數(shù)全部綁定到一個(gè)全局變量中。
// 唯一的全局變量MYAPP:
var MYAPP = {};
// 其他變量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其他函數(shù):
MYAPP.foo = function () {
return 'foo';
};
局部作用域
var
的作用域是函數(shù)內(nèi)部,所以:
function foo() {
for (var i=0; i<100; i++) {
//
}
i += 100; // 仍然可以引用變量i
}
塊級(jí)使用let
代替var
常量
const
來(lái)定義常量 和let
一樣,是塊級(jí)作用域
解構(gòu)賦值
傳統(tǒng)
var array = ['hello', 'JavaScript', 'ES6'];
var x = array[0];
var y = array[1];
var z = array[2];
解構(gòu)賦值
var [x, y, z] = ['hello', 'JavaScript', 'ES6'];
多個(gè)變量要用[...]
括起來(lái)
如果需要從一個(gè)對(duì)象中取出若干屬性梆惯,也可以使用解構(gòu)賦值酱鸭,便于快速獲取對(duì)象的指定屬性:
var person = {
name: '小明',
age: 20,
gender: 'male',
passport: 'G-12345678',
school: 'No.4 middle school'
};
var {name, age, passport} = person;
可以
var x=1, y=2;
[x, y] = [y, x]
還可以獲取當(dāng)前頁(yè)面的域名和路徑
var {hostname:domain, pathname:path} = location;
方法
在一個(gè)對(duì)象中綁定函數(shù),稱為這個(gè)對(duì)象的方法垛吗。
var xiaoming = {
name: '小明',
birth: 1990,
age: function () {
var y = new Date().getFullYear();
return y - this.birth;
}
};
方法內(nèi)部,this
是一個(gè)特殊變量凹髓,它始終指向當(dāng)前對(duì)象
this
是一個(gè)大坑
如果函數(shù)定義在全局位置,那么this
就指向window
如果還是按照上面那么寫,然后這樣調(diào)用
var fn = xiaoming.age; // 先拿到xiaoming的age函數(shù)
fn(); // NaN
還是錯(cuò)的,this必須指向正確.
比較省心的辦法是,在對(duì)象內(nèi)部一開(kāi)始就捕獲this
用var that = this;
,你就可以放心地在方法內(nèi)部定義其他函數(shù)怯屉,而不是把所有語(yǔ)句都堆到一個(gè)方法中蔚舀。
apply
也為了解決this
的問(wèn)題,用apply
來(lái)指定,在對(duì)象外部定義的方法的this
的指向
它接收兩個(gè)參數(shù),第一個(gè)參數(shù)就是需要綁定的this
變量锨络,第二個(gè)參數(shù)是Array
赌躺,表示函數(shù)本身的參數(shù)。
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 參數(shù)為空
call()
也可以,不過(guò)就是 apply()
的第二個(gè)參數(shù)是Array
,call()
是將參數(shù)按順序一個(gè)一個(gè)傳入,可能更麻煩一點(diǎn).
Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5
對(duì)普通函數(shù)調(diào)用羡儿,我們通常把this綁定為null寿谴。
裝飾器
應(yīng)用apply()
'use strict';
var count = 0;
var oldParseInt = parseInt; // 保存原函數(shù)
window.parseInt = function () {
count += 1;
return oldParseInt.apply(null, arguments); // 調(diào)用原函數(shù)
};