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