一個(gè)動畫實(shí)現(xiàn)的函數(shù)。
創(chuàng)新互聯(lián)建站專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、鹿城網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為鹿城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
參數(shù):elementID = 動畫元素的ID
final_x = 動畫結(jié)束x坐標(biāo)
final_y = 動畫結(jié)束y坐標(biāo)
interval = 動畫間隔時(shí)間
if?(elem.movement)?{
clearTimeout(elem.movement);
}
//?如果計(jì)時(shí)器已聲明,就是動畫已經(jīng)開始遞歸執(zhí)行,則清除之前的計(jì)時(shí)器
if?(xpos?==?final_x??ypos?==?final_y)?{
return?true;
}//?如果已到達(dá)指定結(jié)束位置,停止執(zhí)行
if?(xpos??final_x)?{
var?dist?=?Math.ceil((final_x?-?xpos)/15);
xpos?=?xpos?+?dist;
}//?沒有到達(dá)指定位置時(shí),獲取移動的x速度,15分之一并取整
if?(xpos??final_x)?{
var?dist?=?Math.ceil((xpos?-?final_x)/15);
xpos?=?xpos?-?dist;
}//?同上
if?(ypos??final_y)?{
var?dist?=?Math.ceil((final_y?-?ypos)/15);
ypos?=?ypos?+?dist;
}//?同上
if?(ypos??final_y)?{
var?dist?=?Math.ceil((ypos?-?final_y)/15);
ypos?=?ypos?-?dist;
}//?同上
elem.style.left?=?xpos?+?"px";//?移動
elem.style.top?=?ypos?+?"px";//?移動
//?遞歸函數(shù)?
var?repeat?=?"moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
elem.movement?=?setTimeout(repeat,interval);
主要作用應(yīng)該是:做出網(wǎng)頁的特效和美化頁面...... 一個(gè)最簡單的函數(shù): HTML HEAD TITLE New Document /TITLE SCRIPT LANGUAGE="JavaScript" !-- function showColor(col) { document.bgColor=col; } //-- /SCRIPT /HEAD BODY bgcolor="green" center FORM METHOD=POST ACTION="" input type="button" value="不許碰我" onclick="showColor('red')" input type="button" value="警告你別碰我"onclick="showColor('blue')" input type="button" value="給你點(diǎn)顏色看"onclick="showColor('yellow')" /FORM /center /BODY /HTML 看一下........
首先不是“在for循環(huán)中 i 是取不到值得嗎? 只有在循環(huán)結(jié)束后 i=3,i才被賦值”
而是“在for循環(huán)當(dāng)中,i會變化,但是inner函數(shù)當(dāng)中的i值并沒有被立即調(diào)用”
這個(gè)和js的執(zhí)行順序有關(guān)系,i值會在for循環(huán)執(zhí)行的時(shí)候不斷變化,當(dāng)調(diào)用計(jì)時(shí)器的時(shí)候,i值已經(jīng)是3了
這個(gè)是典型的閉包問題,涉及到作用域的相關(guān)知識(在函數(shù)inner當(dāng)中并沒有i這個(gè)變量,變量是位于func這個(gè)函數(shù)當(dāng)中的,此時(shí),在調(diào)用inner的時(shí)候,要尋找i這個(gè)變量存儲空間,找不到所以向父級查找,父級func當(dāng)中有i,由于for循環(huán)已經(jīng)執(zhí)行完畢,i值已經(jīng)被設(shè)置成了3,所以~自然是打出3的),建議你先了解一下作用域,另外也了解一下計(jì)時(shí)器,關(guān)于計(jì)時(shí)器的類似的一道題-JavaScript計(jì)時(shí)器
1:調(diào)用關(guān)鍵字function來構(gòu)造
function distance(x1,x2,y1,y2)
{
var dx=x2-x1;
var dy=y2-y1;
return Math.sqrt(dx*dx+dy*dy);
}
2:使用Function()構(gòu)造函數(shù)(請注意與上面的大小寫)
var f=new Function*"x","y","return x*y");
這行代碼創(chuàng)建了一個(gè)新函數(shù),該函數(shù)和你所熟悉的語法定義的函數(shù)基本上時(shí)等價(jià)的:
function f(x,y)
{
return x*y;
}
Functino()構(gòu)造函數(shù)可以接受任意多個(gè)字符串參數(shù)。它的最后一個(gè)參數(shù)時(shí)函數(shù)的主體,其中可以包含任何JavaScript語句,語句之間用分號分隔。其他的參數(shù)都是用來說明函數(shù)要定義的形式參數(shù)名的字符串。如果你定義的函數(shù)沒有參數(shù),那么可以只需給構(gòu)造函數(shù)傳遞一個(gè)字符串(即函數(shù)的主體)即可。
注意,傳遞給構(gòu)造函數(shù)Function()的參數(shù)中沒有一個(gè)用于說明它要創(chuàng)建的函數(shù)名。用Function()構(gòu)造函數(shù)創(chuàng)建的未命名函數(shù)有時(shí)被成為“匿名函數(shù)”。
你可能非常想知道Function()構(gòu)造函數(shù)的用途是什么。為什么不能只用function語句來定義所有的函數(shù)呢?原因是Function()構(gòu)造函數(shù)允許我們動態(tài)地建立和編譯一個(gè)函數(shù),它不會將我們限制在function語句預(yù)編譯的函數(shù)體中。這樣做帶來的負(fù)面影響效應(yīng)就是每次調(diào)用一個(gè)函數(shù)時(shí),F(xiàn)unction()構(gòu)造函數(shù)都要對它進(jìn)行編譯。因此,在循環(huán)體中或者在經(jīng)常使用的函數(shù)中,我們不應(yīng)該頻繁地調(diào)用這個(gè)構(gòu)造函數(shù)。
使用Function()構(gòu)造函數(shù)的另一個(gè)原因是它能夠?qū)⒑瘮?shù)定義為JavaScript表達(dá)式的一部分,而不是將其定義一個(gè)語句,這種情況下使用它就顯得比較的方面,甚至可以說精致。
3:函數(shù)直接量
函數(shù)直接量是一個(gè)表達(dá)式,它可以定義匿名函數(shù)。函數(shù)直接量的語法和function語句非常相似,只不過它被用作表達(dá)式,而不是用作語句,而且也無需指定函數(shù)名。下面的三行代碼分別使用function()語句、Funciont()構(gòu)造函數(shù)和函數(shù)直接量定義了三個(gè)基本上相同的函數(shù):
function f(x){return x*x};
var f=new Function("x","return x*x;");
var f=function(x){reurn x*x};
在JavaScript1.1中,可以使用構(gòu)造函數(shù)Function()來定義函數(shù),在JavaScript1.2和其后的版本中,還可以使用函數(shù)直接量來構(gòu)造函數(shù)。你應(yīng)該注意這兩種方法之間的重要差別。
首先,構(gòu)造函數(shù)Function()允許在運(yùn)行時(shí)動態(tài)地創(chuàng)建和編譯JavaScript代碼。但是函數(shù)直接量卻是函數(shù)結(jié)構(gòu)的一個(gè)靜態(tài)部分,就像function語句一樣。
其次,作為第一個(gè)差別的必然結(jié)果,每次調(diào)用構(gòu)造函數(shù)Function()時(shí)都會解析函數(shù)體并且創(chuàng)建一個(gè)新東漢數(shù)對象。如果對構(gòu)造函數(shù)的調(diào)用出現(xiàn)在一個(gè)循環(huán)中,或者出現(xiàn)在一個(gè)經(jīng)常被調(diào)用的函數(shù)中,這種方法的效率非常低。另一個(gè)方面,函數(shù)直接量或出現(xiàn)在循環(huán)和函數(shù)中的嵌套函數(shù)不是在每次調(diào)用時(shí)都被重新編譯,而且每當(dāng)遇到一個(gè)函數(shù)直接量時(shí)也不創(chuàng)建一個(gè)新的函數(shù)對象。
Function()構(gòu)造函數(shù)和函數(shù)之間量之間的第三點(diǎn)差別是,使用構(gòu)造函數(shù)Function()創(chuàng)建的函數(shù)不使用詞法作用域,相反的,它們總是被當(dāng)作頂級函數(shù)來編譯,就像下面代碼所說明的那樣:
function?Math(){};
Math.prototype=new?Object();
/**
*?Property?E
*?@memberOf?Math
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.E=0;
/**
*?Property?LN10
*?@memberOf?Math
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.LN10=0;
/**
*?Property?LN2
*?@memberOf?Math
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.
*/
Math.LN2=0;
/**
*?Property?LOG2E
*?@memberOf?Math
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.LOG2E=0;
/**
*?Property?LOG10E
*?@memberOf?Math
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.?
*/
Math.LOG10E=0;
/**
*?Property?PI
*?@memberOf?Math
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.??
*/
Math.PI=0;
/**
*?Property?SQRT1_2
*?@memberOf?Math
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.SQRT1_2=0;
/**
*?Property?SQRT2
*?@memberOf?Math
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.?
*/
Math.SQRT2=0;
/**
*?function?abs(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.?????
*/
Math.abs=function(x){return?0;};
/**
*?function?acos(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.
*/
Math.acos=function(x){return?0;};
/**
*?function?asin(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.??
*/
Math.asin=function(x){return?0;};
/**
*?function?atan(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.
*/
Math.atan=function(x){return?0;};
/**
*?function?atan2(x,y)
*?@memberOf?Math
*?@param?{Number}?x
*?@param?{Number}?y
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.??
*/
Math.atan2=function(x,y){return?0;};
/**
*?function?ceil(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.ceil=function(x){return?0;};
/**
*?function?cos(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.??
*/
Math.cos=function(x){return?0;};
/**
*?function?exp(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.?
*/
Math.exp=function(x){return?0;};
/**
*?function?floor(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.??
*/
Math.floor=function(x){return?0;};
/**
*?function?log(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.log=function(x){return?0;};
/**
*?function?max(arg)
*?@memberOf?Math
*?@param?{Number}?args
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.??
*/
Math.max=function(args){return?0;};
/**
*?function?min(arg)
*?@memberOf?Math
*?@param?{Number}?args
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.min=function(args){return?0;};
/**
*?function?pow(x,y)
*?@memberOf?Math
*?@param?{Number}?x
*?@param?{Number}?y
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.pow=function(x,y){return?0;};
/**
*?function?pow()
*?@memberOf?Math
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.?????
*/
Math.random=function(){return?0;};
/**
*?function?round(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.???
*/
Math.round=function(x){return?0;};
/**
*?function?sin(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.sin=function(x){return?0;};
/**
*?function?sqrt(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.?????
*/
Math.sqrt=function(x){return?0;};
/**
*?function?tan(x)
*?@memberOf?Math
*?@param?{Number}?x
*?@type?Number
*?@returns?{Number}
*?@since???Standard?ECMA-262?3rd.?Edition?
*?@since???Level?2?Document?Object?Model?Core?Definition.????
*/
Math.tan=function(x){return?0;};
節(jié)流概念(Throttle)
按照設(shè)定的時(shí)間固定執(zhí)行一次函數(shù),比如200ms一次。注意:固定就是你在mousemove過程中,執(zhí)行這個(gè)節(jié)流函數(shù),它一定是200ms(你設(shè)定的定時(shí)器延遲時(shí)間)內(nèi)執(zhí)行一次。沒到200ms,一定會返回,沒有執(zhí)行回調(diào)函數(shù)的。
主要應(yīng)用場景有:scroll、touchmove
防抖概念(Debounce)
抖動停止后的時(shí)間超過設(shè)定的時(shí)間時(shí)執(zhí)行一次函數(shù)。注意:這里的抖動停止表示你停止了觸發(fā)這個(gè)函數(shù),從這個(gè)時(shí)間點(diǎn)開始計(jì)算,當(dāng)間隔時(shí)間等于你設(shè)定時(shí)間,才會執(zhí)行里面的回調(diào)函數(shù)。如果你一直在觸發(fā)這個(gè)函數(shù)并且兩次觸發(fā)間隔小于設(shè)定時(shí)間,則一定不會到回調(diào)函數(shù)那一步?!?/p>
主要應(yīng)用場景有:input驗(yàn)證、搜索聯(lián)想、resize
節(jié)流實(shí)現(xiàn)
思路: 第一次先設(shè)定一個(gè)變量true,第二次執(zhí)行這個(gè)函數(shù)時(shí),會判斷變量是否true,是則返回。當(dāng)?shù)谝淮蔚亩〞r(shí)器執(zhí)行完函數(shù)最后會設(shè)定變量為flase。那么下次判斷變量時(shí)則為flase,函數(shù)會依次運(yùn)行。
防抖實(shí)現(xiàn)
思路:首次運(yùn)行時(shí)把定時(shí)器賦值給一個(gè)變量,第二次執(zhí)行時(shí),如果間隔沒超過定時(shí)器設(shè)定的時(shí)間則會清除掉定時(shí)器,重新設(shè)定定時(shí)器,依次反復(fù),當(dāng)我們停止下來時(shí),沒有執(zhí)行清除定時(shí)器,超過一定時(shí)間后觸發(fā)回調(diào)函數(shù)。
博文有介紹更詳細(xì)的原理和代碼demo:網(wǎng)頁鏈接,希望可以幫到您