最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺析JavaScript中的Function類(lèi)型

 更新時(shí)間:2016年07月09日 09:41:51   作者:chaos_JS  
Function是javascript里最常用的一個(gè)概念,javascript里的function是最容易入手的一個(gè)功能,但它也是javascript最難理解最難掌握的一個(gè)概念。這篇文章主要介紹了JavaScript中的Function類(lèi)型的相關(guān)資料,一起看下吧

Function是javascript里最常用的一個(gè)概念,javascript里的function是最容易入手的一個(gè)功能,但它也是javascript最難理解最難掌握的一個(gè)概念。

1. Function類(lèi)型是js中引用類(lèi)型之一,每個(gè)函數(shù)實(shí)際上都是Function類(lèi)型的實(shí)例對(duì)象,具有自己的屬性和方法。正因?yàn)楹瘮?shù)式對(duì)象,所以函數(shù)名實(shí)際上也是一個(gè)指向函數(shù)對(duì)象的指針。

2. 常用的函數(shù)定義方式

1. 函數(shù)聲明:

function sum(a , b ){
return a+b;
}

2. 表達(dá)式:

var sum = function(){
return a+b; 
}; //注意分號(hào)
 //兩種方式的區(qū)別:
 //解釋器會(huì)率先讀取函數(shù)聲明,并使其在執(zhí)行之前可以訪問(wèn),而使用表達(dá)式則必須等到解析器執(zhí)行到它所在的代碼行,才會(huì)真正被解釋執(zhí)行(變量聲明提前,而值留在原地)
alert (sum (10 ,10));
function sum(a ,b){
  return a+b;
}
//↑上面的代碼會(huì)正常執(zhí)行,因?yàn)樵诖a執(zhí)行前,解析器通過(guò)函數(shù)聲明提升,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境中,放到代碼樹(shù)的頂部
alert (typeof sum);
alert(sum(10 , 10));
var sum = function (a ,b){
  return a+b;
}
//↑報(bào)錯(cuò),原因在于函數(shù)位于一個(gè)初始化語(yǔ)句中,不是一個(gè)函數(shù)聲明,不會(huì)被提前,而只會(huì)把var sum提前,用typeof操作符顯示sum是undefined,所以報(bào)錯(cuò)

3. 函數(shù)名僅僅保存指向函數(shù)對(duì)象的指針,因此函數(shù)名與包含對(duì)象指針的其他變量沒(méi)什么不同,也就是說(shuō),一個(gè)函數(shù)對(duì)象可以有多個(gè)名字:

function sum(a , b ){
return a+b;
}
console.log(sum(2 ,3)); //5
var anotherSum = sum; //變量anotherSum也指向了同一個(gè)函數(shù)對(duì)象
console.log(anotherSum(4 , 5)); //9
sum = null; //sum變量不再保存函數(shù)對(duì)象的指針了
console.log(anotherSum(1 , 3)); //anotherSum這個(gè)變量仍能調(diào)用

4. JS為何沒(méi)有重載這個(gè)概念。

function add(a){
return a+3 ;
}
function add(a){
return a+5;
}
var result = add(3); //8
//兩個(gè)函數(shù)同名了,結(jié)果只能是后一個(gè)函數(shù)覆蓋前一個(gè),所以不能重載

5. 函數(shù)的內(nèi)部屬性:函數(shù)內(nèi)部,有兩個(gè)特殊的對(duì)象,arguments和this

  1. arguments:

    arguments是個(gè)類(lèi)數(shù)組對(duì)象,包含著傳入函數(shù)的所有參數(shù),這個(gè)對(duì)象有一個(gè)叫callee的屬性,屬性值是一個(gè)指針,指向擁有這個(gè)arguments對(duì)象的函數(shù)本身

function foo (){
var a =arguments.callee; 
return a.toString();
}
foo();
/*
返回結(jié)果:
  "function sum(){
  var a =arguments.callee; 
  return a.toString();
  }"
也就是說(shuō),一個(gè)函數(shù)內(nèi)部,arguments.callee指的就是這個(gè)函數(shù)本身。這個(gè)函數(shù)在遞歸調(diào)用時(shí)有點(diǎn)用,有許多缺陷,在ES5嚴(yán)格模式被移除
*/

  2. this:簡(jiǎn)單來(lái)說(shuō),this指的就是函數(shù)執(zhí)行的環(huán)境對(duì)象,在哪個(gè)對(duì)象中執(zhí)行,this就指哪個(gè)對(duì)象。展開(kāi)來(lái)說(shuō)比較復(fù)雜,單開(kāi)一篇

//TODO:

  3. ES5規(guī)范了函數(shù)的另一個(gè)屬性:caller,這個(gè)函數(shù)屬性指的是調(diào)用當(dāng)前函數(shù)的函數(shù)

function inner(){
console.log(inner.caller);
} 
function outer(){
inner();
}
outer(); 
//function outer(){
inner();
}

  4. length屬性:表示函數(shù)希望接受的參數(shù)個(gè)數(shù)

function add(a ,b ,c){
return a+b+c;
}
add.length; //3

  5. 著名的prototype屬性,簡(jiǎn)單來(lái)說(shuō),是一個(gè)對(duì)象,是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的一個(gè)對(duì)象,包含可以由特定類(lèi)型的所有實(shí)例共享的屬性和方法。展開(kāi)來(lái)說(shuō)比較復(fù)雜,單開(kāi)一篇

//TODO:

6. 函數(shù)的兩個(gè)方法:call()和apply(),作用都是在特定的作用域中調(diào)用函數(shù),實(shí)際上就是設(shè)置函數(shù)內(nèi)部的this值

  1. call():與apply()方法類(lèi)似,區(qū)別在接收參數(shù)的方式不同,參數(shù)必須逐個(gè)列出來(lái)。

  2. apply():接收兩個(gè)參數(shù),一個(gè)是函數(shù)運(yùn)行的作用域,另一個(gè)是參數(shù)數(shù)組,可以是數(shù)組,也可以是arguments這個(gè)類(lèi)數(shù)組對(duì)象

function sum(a , b){
return a+b;
}
function callSum(a , b){
return sum.apply(this , arguments);
}//第二個(gè)參數(shù)是一個(gè)類(lèi)數(shù)組對(duì)象arguments
function callSum1(a , b){
return sum.apply(this, [a , b]);
} //第二個(gè)參數(shù)是一個(gè)數(shù)組
console.log(callSum(2 , 3)); //5 
console.log(callSum1(3 ,5)); //8

  3. 傳遞參數(shù)并調(diào)用函數(shù)并非call()和apply()的用武之地,二者真正強(qiáng)大的地方是擴(kuò)充函數(shù)運(yùn)行的作用域

var color = 'red';
var obj = {
color :'blue' 
}
function foo(){
console.log(this.color); 
}
foo(); //'red'
foo.call(this);//'red'
foo.call(obj); //'blue'
//最后一次調(diào)用foo()函數(shù)的執(zhí)行環(huán)境變了,其中的this指向了obj對(duì)象,所以是'blue'

   使用call()和apply()擴(kuò)充作用域的最大好處,就是使對(duì)象與方法之間解耦

  4. ES5定義了一個(gè)新方法:bind(),返回一個(gè)函數(shù),這個(gè)函數(shù)中this值會(huì)被綁定到傳給bind()函數(shù)的值

var x = 9; 
var module = {
x: 81,
getX: function() { return this.x; }
};
module.getX(); // 81
var retrieveX = module.getX;
retrieveX(); // 9, 因?yàn)樵谶@種情況下, "this" 指向全局變量
var boundGetX = retrieveX.bind(module);//把retrieveX()函數(shù)中的this永遠(yuǎn)與module綁定,再調(diào)用這個(gè)函數(shù)永遠(yuǎn)都是在module對(duì)象中運(yùn)行
boundGetX(); // 81

以上所述是小編給大家介紹的深入淺析JavaScript中的Function類(lèi)型介紹,希望對(duì)大家有所幫助,如果大家想了解更多內(nèi)容,敬請(qǐng)關(guān)注腳本之家。

相關(guān)文章

  • 前端實(shí)現(xiàn)PDF文件預(yù)覽的7種方案與性能對(duì)比詳解

    前端實(shí)現(xiàn)PDF文件預(yù)覽的7種方案與性能對(duì)比詳解

    這篇文章主要為大家詳細(xì)介紹了前端實(shí)現(xiàn)PDF文件預(yù)覽的7種方案與性能對(duì)比,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • 原生JS實(shí)現(xiàn)移動(dòng)端web輪播圖詳解(結(jié)合Tween算法造輪子)

    原生JS實(shí)現(xiàn)移動(dòng)端web輪播圖詳解(結(jié)合Tween算法造輪子)

    在做移動(dòng)端開(kāi)發(fā)的時(shí)候,必不可少的是輪播圖,下面這篇文章主要給大家介紹了關(guān)于利用純JS實(shí)現(xiàn)移動(dòng)端web輪播圖的相關(guān)資料,重要的是結(jié)合Tween算法造輪子,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • javascript實(shí)現(xiàn)3D變換的立體圓圈實(shí)例

    javascript實(shí)現(xiàn)3D變換的立體圓圈實(shí)例

    這篇文章主要介紹了javascript實(shí)現(xiàn)3D變換的立體圓圈效果,涉及javascript動(dòng)態(tài)操作頁(yè)面元素實(shí)現(xiàn)滾動(dòng)與變色的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • 網(wǎng)頁(yè)圖片延時(shí)加載的js代碼

    網(wǎng)頁(yè)圖片延時(shí)加載的js代碼

    大家如果使用firebug去查看的話就會(huì)發(fā)現(xiàn),當(dāng)你滾動(dòng)到相應(yīng)的行時(shí),當(dāng)前行的圖片才即時(shí)加載的,這樣子的話頁(yè)面在打開(kāi)只加可視區(qū)域的圖片,而其它隱藏的圖片則不加載,一定程序上加快了頁(yè)面加載的速度,對(duì)于比較長(zhǎng)的頁(yè)面來(lái)說(shuō),這個(gè)方案是比較好的。
    2010-04-04
  • 在js里怎么實(shí)現(xiàn)Xcode里的callFuncN方法(詳解)

    在js里怎么實(shí)現(xiàn)Xcode里的callFuncN方法(詳解)

    下面小編就為大家?guī)?lái)一篇在js里怎么實(shí)現(xiàn)Xcode里的callFuncN方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • 幫你徹底搞懂JS中的prototype、__proto__與constructor(圖解)

    幫你徹底搞懂JS中的prototype、__proto__與constructor(圖解)

    這篇文章主要介紹了詳解幫你徹底搞懂JS中的prototype、__proto__與constructor(圖解),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • JavaScript this在函數(shù)中的指向及實(shí)例詳解

    JavaScript this在函數(shù)中的指向及實(shí)例詳解

    這篇文章主要介紹了JavaScript this在函數(shù)中的指向及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • javascript判斷chrome瀏覽器的方法

    javascript判斷chrome瀏覽器的方法

    這篇文章主要介紹了javascript判斷chrome瀏覽器的方法,通過(guò)userAgent判斷檢測(cè)一下userAgent返回的字符串里面是否包含“Chrome”,需要的朋友可以參考下
    2014-03-03
  • JavaScript閉包原理與用法實(shí)例分析

    JavaScript閉包原理與用法實(shí)例分析

    這篇文章主要介紹了JavaScript閉包原理與用法,結(jié)合實(shí)例形式分析了javascript閉包的概念、功能、常見(jiàn)問(wèn)題及相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • Postman的FormData傳參的使用示例詳解

    Postman的FormData傳參的使用示例詳解

    今年上半年因?yàn)樽霎呍O(shè)的原因,有自己接觸到后端,也是用過(guò)了postman去測(cè)試接口,看到了postman那邊的參數(shù)形式,一直對(duì)這個(gè)formData有想法,今天通過(guò)本文給大家介紹Postman的FormData傳參的使用,感興趣的朋友一起看看吧
    2023-10-10

最新評(píng)論

青冈县| 裕民县| 天镇县| 蛟河市| 台南市| 开江县| 蓝山县| 麟游县| 从江县| 杭锦旗| 榕江县| 乌鲁木齐市| 娱乐| 兰溪市| 富民县| 伊春市| 郑州市| 徐水县| 钟祥市| 菏泽市| 临邑县| 泰顺县| 邻水| 杨浦区| 包头市| 威远县| 合作市| 澄江县| 芜湖县| 仁寿县| 大冶市| 柯坪县| 寿阳县| 中西区| 龙游县| 海宁市| 万安县| 突泉县| 宿迁市| 藁城市| 永登县|