js筆記02-函數(shù)

定義方式

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ù)
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市失受,隨后出現(xiàn)的幾起案子讶泰,更是在濱河造成了極大的恐慌,老刑警劉巖拂到,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痪署,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡兄旬,警方通過(guò)查閱死者的電腦和手機(jī)狼犯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)领铐,“玉大人悯森,你說(shuō)我怎么就攤上這事⌒髂欤” “怎么了瓢姻?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)音诈。 經(jīng)常有香客問(wèn)我幻碱,道長(zhǎng)绎狭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任褥傍,我火速辦了婚禮儡嘶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恍风。我一直安慰自己蹦狂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布朋贬。 她就那樣靜靜地躺著凯楔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兄世。 梳的紋絲不亂的頭發(fā)上啼辣,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天啊研,我揣著相機(jī)與錄音御滩,去河邊找鬼。 笑死党远,一個(gè)胖子當(dāng)著我的面吹牛削解,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沟娱,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼氛驮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了济似?” 一聲冷哼從身側(cè)響起矫废,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砰蠢,沒(méi)想到半個(gè)月后蓖扑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡台舱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年律杠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竞惋。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柜去,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拆宛,到底是詐尸還是另有隱情嗓奢,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布浑厚,位于F島的核電站蔓罚,受9級(jí)特大地震影響椿肩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豺谈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一郑象、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茬末,春花似錦厂榛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至责掏,卻和暖如春柜砾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背换衬。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工痰驱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞳浦。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓担映,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親叫潦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝇完,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 函數(shù)函數(shù)定義與調(diào)用變量作用域全局變量方法高階函數(shù)閉包箭頭函數(shù)$generator$ 函數(shù) 函數(shù)定義與調(diào)用 定義函數(shù)...
    染微言閱讀 577評(píng)論 0 5
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語(yǔ)閱讀 3,616評(píng)論 0 7
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值矗蕊,只能采用變通的方法短蜕。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,357評(píng)論 0 1
  • 參考 學(xué)習(xí)網(wǎng)站 廖雪峰的JavaScript教程 w3cshool 阮一峰的JavaScript全棧工程師培訓(xùn)教程...
    HuangJn閱讀 333評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)傻咖,斷路器朋魔,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139