頭函數(shù)(Arrow Function)是ES6新增的特性,在網(wǎng)上看了一篇個(gè)人博客的講解,寫(xiě)的例子里面居然還有聲明的變量沒(méi)有被使用,卻還在招攬學(xué)生做IT培訓(xùn),真的誤人子弟。
為了說(shuō)明箭頭函數(shù),我們先寫(xiě)個(gè)簡(jiǎn)單的代碼:
const domain_list=[
'www.abot.cn',
'www.tseo.cn',
'www.weiduke.com',
'yanyubao.tseo.cn'
];
console.log(domain_list.map(domain_item=> domain_item.length));
// expected output: Array [11, 11, 15, 16]
關(guān)于JavaScript中map函數(shù)的使用,這里不贅述,不懂的抓緊惡補(bǔ)。
重點(diǎn)看第8行。
domain_item=> domain_item.length
等價(jià)于以下寫(xiě)法:
function(domain_item) {return domain_item.length}
所以以上代碼的ES5的寫(xiě)法為:
const domain_list=[
'www.abot.cn',
'www.tseo.cn',
'www.weiduke.com',
'yanyubao.tseo.cn'
];
console.log(domain_list.map(function(domain_item) {
return domain_item.length;
}));
// expected output: Array [11, 11, 15, 16]
總結(jié)總結(jié)一下,ES6的基本語(yǔ)法
(param1, param2, …, paramN)=> { statements }
(param1, param2, …, paramN)=> expression
//相當(dāng)于:(param1, param2, …, paramN)=>{ return expression; }
// 當(dāng)只有一個(gè)參數(shù)時(shí),圓括號(hào)是可選的:
(singleParam)=> { statements }
singleParam=> { statements }
// 沒(méi)有參數(shù)的函數(shù)應(yīng)該寫(xiě)成一對(duì)圓括號(hào)。
()=> { statements }
對(duì)照以上的例子,什么是箭頭函數(shù)應(yīng)該一目了然了。
this一般是這樣被定義的:
function Person() {
// Person() 構(gòu)造函數(shù)定義 `this`作為它自己的實(shí)例.
this.age=0;
setInterval(function growUp() {
// 在非嚴(yán)格模式, growUp()函數(shù)定義 `this`作為全局對(duì)象,
// 與在 Person()構(gòu)造函數(shù)中定義的 `this`并不相同.
this.age++;
}, 1000);
}
var p=new Person();
在ECMAScript 3/5中,通過(guò)將this值分配給封閉的變量,可以解決this問(wèn)題。
function Person() {
var that=this;
that.age=0;
setInterval(function growUp() {
// 回調(diào)引用的是`that`變量, 其值是預(yù)期的對(duì)象.
that.age++;
}, 1000);
}
或者,可以創(chuàng)建綁定函數(shù),以便將預(yù)先分配的this值傳遞到綁定的目標(biāo)函數(shù)(上述示例中的growUp()函數(shù))。
箭頭函數(shù)不會(huì)創(chuàng)建自己的this,它只會(huì)從自己的作用域鏈的上一層繼承this。因此,在下面的代碼中,傳遞給setInterval的函數(shù)內(nèi)的this與封閉函數(shù)中的this值相同:
function Person(){
this.age=0;
setInterval(()=> {
this.age++; // |this| 正確地指向 p 實(shí)例
}, 1000);
}
var p=new Person();
如果不理解以上代碼,那么再?gòu)?qiáng)調(diào)一遍:因?yàn)榧^函數(shù)沒(méi)有this,所以setInterval函數(shù)中的箭頭函數(shù)的this,只能是他的上一級(jí)函數(shù)的this。如果說(shuō)到這樣還不理解,建議惡補(bǔ)語(yǔ)文。
箭頭函數(shù)的進(jìn)階知識(shí),包括:
感興趣的小伙伴可以自個(gè)去研究。
們經(jīng)常看到許多網(wǎng)站或者H5的動(dòng)畫(huà)都做成了整屏切換的形式,為提高用戶體驗(yàn),會(huì)在首屏頁(yè)面下方放上一個(gè)動(dòng)態(tài)的向下箭頭來(lái)提示用戶切換至下一屏。
動(dòng)態(tài)箭頭的效果圖如下:
那么這種效果是如何實(shí)現(xiàn)的呢?
其實(shí)非常簡(jiǎn)單,在CSS3中提供了animation屬性,專(zhuān)門(mén)用于動(dòng)畫(huà)。要使用這個(gè)屬性,需要先了解@keyframes的創(chuàng)建規(guī)則,在 @keyframes 中規(guī)定某項(xiàng) CSS 樣式,就能創(chuàng)建由當(dāng)前樣式逐漸改為新樣式的動(dòng)畫(huà)效果。
在這個(gè)動(dòng)畫(huà)中,我們能夠看出在整個(gè)動(dòng)畫(huà)中改變的是箭頭的位置,所以我們?cè)趧?chuàng)建動(dòng)畫(huà)時(shí),只需要給定箭頭的起始位置,利用animation讓他動(dòng)起來(lái)就可以了。
接下來(lái),我們一步一步完成。
1、首先找到你所需要的箭頭圖片,將他利用定位的方式放在首屏的底部。
a)html代碼(將圖片以背景或者插入圖片的形式放入標(biāo)簽內(nèi),demo以背景形式展示)
b)css代碼(利用定位將箭頭放在首屏的底部適當(dāng)位置,網(wǎng)站中大部分情況會(huì)進(jìn)行左右居中)
2、然后進(jìn)行動(dòng)畫(huà)創(chuàng)建,最簡(jiǎn)單的方式就是只給定初始的以及結(jié)束的css樣式即可。
css 代碼
標(biāo)注出來(lái)的為動(dòng)畫(huà)的自定義名稱(chēng),可以根據(jù)你的動(dòng)畫(huà)行為來(lái)定義。
0%為初始狀態(tài),即剛開(kāi)始動(dòng)畫(huà)時(shí)。
100%為結(jié)束狀態(tài),即動(dòng)畫(huà)進(jìn)行到100%時(shí)。
動(dòng)畫(huà)改變了箭頭的底部位置,由距離底部80像素變到了距離底部0像素。
3、接下來(lái)利用animation屬性讓他具有動(dòng)畫(huà)效果
css代碼:
第一個(gè)參數(shù)表示你所使用的動(dòng)畫(huà)的名稱(chēng)(即我們創(chuàng)建的動(dòng)畫(huà)的動(dòng)畫(huà)名稱(chēng)),
第二個(gè)參數(shù)表示動(dòng)畫(huà)完成的時(shí)間(即由0%到100%所用的時(shí)間),
第三個(gè)參數(shù)表示動(dòng)畫(huà)執(zhí)行的次數(shù)(可以為任意數(shù)字,infinite表示規(guī)定動(dòng)畫(huà)無(wú)限次播放),因此造成了一個(gè)動(dòng)態(tài)的箭頭的視覺(jué)效果。
通過(guò)以上三個(gè)步驟即可完成這個(gè)簡(jiǎn)單的動(dòng)畫(huà)效果,很多的動(dòng)畫(huà)效果都可以通過(guò)創(chuàng)建動(dòng)畫(huà)的方式來(lái)實(shí)現(xiàn)。
原文地址北京市盛世陽(yáng)光文化傳播有限責(zé)任公司:http://www.gonet.com.cn/webduirshow-140.html
我們深入研究一下箭頭函數(shù)。
箭頭函數(shù)不僅僅是編寫(xiě)簡(jiǎn)潔代碼的“捷徑”。它還具有非常特殊且有用的特性。
JavaScript 充滿了我們需要編寫(xiě)在其他地方執(zhí)行的小函數(shù)的情況。
例如:
JavaScript 的精髓在于創(chuàng)建一個(gè)函數(shù)并將其傳遞到某個(gè)地方。
在這樣的函數(shù)中,我們通常不想離開(kāi)當(dāng)前上下文。這就是箭頭函數(shù)的主戰(zhàn)場(chǎng)啦。
正如我們?cè)?對(duì)象方法,"this" 一章中所學(xué)到的,箭頭函數(shù)沒(méi)有 this。如果訪問(wèn) this,則會(huì)從外部獲取。
例如,我們可以使用它在對(duì)象方法內(nèi)部進(jìn)行迭代:
let group={
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(
student=> alert(this.title + ': ' + student)
);
}
};
group.showList();
這里 forEach 中使用了箭頭函數(shù),所以其中的 this.title 其實(shí)和外部方法 showList 的完全一樣。那就是:group.title。
如果我們使用正常的函數(shù),則會(huì)出現(xiàn)錯(cuò)誤:
let group={
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(function(student) {
// Error: Cannot read property 'title' of undefined
alert(this.title + ': ' + student)
});
}
};
group.showList();
報(bào)錯(cuò)是因?yàn)?forEach 運(yùn)行它里面的這個(gè)函數(shù),但是這個(gè)函數(shù)的 this 為默認(rèn)值 this=undefined,因此就出現(xiàn)了嘗試訪問(wèn) undefined.title 的情況。
但箭頭函數(shù)就沒(méi)事,因?yàn)樗鼈儧](méi)有 this。
不能對(duì)箭頭函數(shù)進(jìn)行 new 操作
不具有 this 自然也就意味著另一個(gè)限制:箭頭函數(shù)不能用作構(gòu)造器(constructor)。不能用 new 調(diào)用它們。
箭頭函數(shù) VS bind
箭頭函數(shù) => 和使用 .bind(this) 調(diào)用的常規(guī)函數(shù)之間有細(xì)微的差別:
箭頭函數(shù)也沒(méi)有 arguments 變量。
當(dāng)我們需要使用當(dāng)前的 this 和 arguments 轉(zhuǎn)發(fā)一個(gè)調(diào)用時(shí),這對(duì)裝飾器(decorators)來(lái)說(shuō)非常有用。
例如,defer(f, ms) 獲得了一個(gè)函數(shù),并返回一個(gè)包裝器,該包裝器將調(diào)用延遲 ms 毫秒:
function defer(f, ms) {
return function() {
setTimeout(()=> f.apply(this, arguments), ms)
};
}
function sayHi(who) {
alert('Hello, ' + who);
}
let sayHiDeferred=defer(sayHi, 2000);
sayHiDeferred("John"); // 2 秒后顯示:Hello, John
不用箭頭函數(shù)的話,可以這么寫(xiě):
function defer(f, ms) {
return function(...args) {
let ctx=this;
setTimeout(function() {
return f.apply(ctx, args);
}, ms);
};
}
在這里,我們必須創(chuàng)建額外的變量 args 和 ctx,以便 setTimeout 內(nèi)部的函數(shù)可以獲取它們。
箭頭函數(shù):
這是因?yàn)椋^函數(shù)是針對(duì)那些沒(méi)有自己的“上下文”,但在當(dāng)前上下文中起作用的短代碼的。并且箭頭函數(shù)確實(shí)在這種使用場(chǎng)景中大放異彩。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。