摘要:不一定有函數(shù)名,所以有匿名函數(shù)表達(dá)式和命名函數(shù)表達(dá)式。引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象。匿名函數(shù)引用函數(shù)作用域內(nèi)的活動(dòng)變量時(shí),已經(jīng)等于了,所以每個(gè)函數(shù)返回的都是。
文章融合了《JavaScript高級(jí)程序設(shè)計(jì)》的知識(shí),和這幾天在segmentfault上的文章的知識(shí)點(diǎn)。屬于整合類文章吧。
函數(shù)簡(jiǎn)介
函數(shù)聲明和函數(shù)表達(dá)式
this和argument
閉包
函數(shù)簡(jiǎn)介函數(shù)實(shí)際上是對(duì)象,所以函數(shù)名實(shí)際上是指向函數(shù)對(duì)象的指針,那么一個(gè)函數(shù)可能有多個(gè)名字。
function sum(num1,num2){ retrun num1+num2; } alert(sum(10,10)); //20 var anotherSum=sum; //將sum的值賦給了anotherSum,此時(shí)它們都指向同一個(gè)函數(shù)。 alert(anotherSum(10,10)); //20 sum=null; //將sum設(shè)置為null,使它與函數(shù)“斷絕關(guān)系” alert(anotherSum(10,10)); //20 ,仍然可以正常調(diào)用。
沒有重載
函數(shù)重載:函數(shù)重載是指在同一作用域內(nèi),可以有一組具有相同函數(shù)名,不同參數(shù)列表的函數(shù),這組函數(shù)被稱為重載函數(shù)。js沒有重載的概念,所以如果聲明了兩個(gè)同名函數(shù),則后面的函數(shù)會(huì)覆蓋前面的函數(shù)。
作為值得函數(shù)
函數(shù)名本身是變量,所以可以作為值來使用。不僅可以像傳遞參數(shù)一樣把一個(gè)函數(shù)傳遞給另一個(gè)函數(shù),而且可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回。
//把一個(gè)函數(shù)傳遞給另一個(gè)函數(shù)的例子 function callFunction(someFunction,someArgument){ return someFuction(someArgument); } function add10(num){ return num+10; } var result=callFunction(add10,10); //要訪問函數(shù)的指針而不執(zhí)行函數(shù)的 話,要去掉函數(shù)名后的圓括號(hào)。 alert(result); //20函數(shù)聲明和函數(shù)表達(dá)式
定義函數(shù)方法:
首先是函數(shù)聲明: function functionName(){}必須有函數(shù)名。
然后是函數(shù)表達(dá)式,比如:
var sum = function(num1,num2){ retrun num1+num2; }; //函數(shù)末尾有分號(hào),就像聲明其他變量時(shí)一樣。
不一定有函數(shù)名,所以有匿名函數(shù)表達(dá)式和命名函數(shù)表達(dá)式。不過,對(duì)函數(shù)命名后,一是在函數(shù)體內(nèi)會(huì)表達(dá)得更清晰,二則是在調(diào)試的時(shí)候要方便很多。
區(qū)別:
函數(shù)聲明可以在定義前調(diào)用(函數(shù)聲明提升),函數(shù)表達(dá)式不可以(和其他表達(dá)式一樣,使用前必須要賦值)。
函數(shù)聲明只是讓瀏覽器知道有這樣一個(gè)函數(shù)了,不會(huì)運(yùn)行。瀏覽器遇到函數(shù)表達(dá)式會(huì)運(yùn)行。
如果不做函數(shù)聲明的話,一般就不希望被重復(fù)調(diào)用,即很大可能就當(dāng)做立即執(zhí)行函數(shù)使用。
如果函數(shù)體作為表達(dá)式的一部分,那它是函數(shù)表達(dá)式,否則為函數(shù)聲明。
在函數(shù)內(nèi)部有兩個(gè)特殊的對(duì)象:arguments和this。
arguments是一個(gè)類數(shù)組對(duì)象,包含傳入函數(shù)的所有參數(shù)。主要作用就是保存函數(shù)參數(shù)。
arguments有一個(gè)callee屬性,該屬性是一個(gè)指針,指向擁有arguments對(duì)象的函數(shù)。
例子:
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }
在函數(shù)factorial中調(diào)用了他本身,但是如果要是將函數(shù)賦值給別的變量,那就不能正常運(yùn)行了。如果是下面的代碼:
function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } }
這樣,不管調(diào)用函數(shù)時(shí)使用什么名字,都可以保證正常完成遞歸調(diào)用。
this:
this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象。
函數(shù)調(diào)用模式時(shí),this指向window。
方法調(diào)用模式時(shí),this指向方法所在對(duì)象。
wiondow.color="red"; var o={color:"blue"}; function sayColor(){ alert(this.color); } sayColor(); //"red" o.sayColor=sayColor; o.saColor(); //"blue"
構(gòu)造函數(shù)模式時(shí),this指向新生成的實(shí)例。
function Aaa(name){ this.name= name; this.getName=function(){ console.log(this.name) } } var a = new Aaa("kitty"); a.getName() // "kitty" var b = new Aaa("bobo"); b.getName() // "bobo"
apply/call調(diào)用模式時(shí),this指向apply/call方法中的第一個(gè)參數(shù)。
var list1 = {name:"andy"} var list2 = {name:"peter"} function d(){ console.log(this.name) } d.call(list1) // "andy" d.call(list2) // "peter"閉包
概念:是指有權(quán)訪問另一個(gè)函數(shù)作用域中變量的函數(shù)。
創(chuàng)建閉包方法:在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。
特征:
可以訪問外部函數(shù)的變量。
比較占內(nèi)存。因?yàn)殚]包會(huì)攜帶包含他的函數(shù)的作用域,在閉包被銷毀后外部函數(shù)的活動(dòng)變量才會(huì)被銷毀。
(ps:關(guān)于活動(dòng)變量知乎上這個(gè)問題的第二個(gè)答案寫的非常非常好?。?/p>
閉包只能取得外部函數(shù)中任何變量的最后一個(gè)值。所以要注意閉包和循環(huán)的使用:
function foo(){ var result=new Array(); for (var i=0;i<10;i++){ result[i]=function(){ return i; }; } return result;
}
返回了一個(gè)函數(shù)數(shù)組,每個(gè)函數(shù)都返回10。因?yàn)檫\(yùn)行foo()函數(shù)的順序是這樣的:先運(yùn)行foo()函數(shù)除了匿名函數(shù)之外的部分,完成后,再運(yùn)行匿名函數(shù)。這時(shí)候for循環(huán)已經(jīng)完成了,i變成了10。匿名函數(shù)引用foo()函數(shù)作用域內(nèi)的活動(dòng)變量i時(shí),i已經(jīng)等于10了,所以每個(gè)函數(shù)返回的都是10。
改進(jìn):
function foo(){ var result=new Array(); for (var i=0;i<10;i++){ result[i]=function(num){ return function(){ return num; }; }(i); } return result; }
模仿塊級(jí)作用域的方法。在調(diào)用外部的匿名函數(shù)時(shí),傳入?yún)?shù)i,變量i的值賦給num,在外部匿名函數(shù)內(nèi)部的閉包,訪問的是numresult數(shù)組的每個(gè)函數(shù)都有自己num變量的一個(gè)副本,就可以返回各自不同的值
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86276.html
摘要:異步那些事一基礎(chǔ)知識(shí)異步那些事二分布式事件異步那些事三異步那些事四異步那些事五異步腳本加載事件概念異步回調(diào)首先了講講中兩個(gè)方法和定義和用法方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式。功能在事件循環(huán)的下一次循環(huán)中調(diào)用回調(diào)函數(shù)。 JS異步那些事 一 (基礎(chǔ)知識(shí))JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers...
摘要:異常處理異常處理一直是回調(diào)的難題,而提供了非常方便的方法在一次調(diào)用中,任何的環(huán)節(jié)發(fā)生,都可以在最終的中捕獲到錯(cuò)誤處理基本的小結(jié)具體的很多的用法可以參考阮一峰的入門教程,還有就是上面提到的電子書。 JS異步那些事 一 (基礎(chǔ)知識(shí))JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers)JS異步那些事 五 (異步腳本...
摘要:模塊化開發(fā)在編程開發(fā)中是一個(gè)非常重要的概念,一個(gè)優(yōu)秀的模塊化項(xiàng)目的后期維護(hù)成本可以大大降低。本文主要介紹模塊化開發(fā)的那些事,文中通過一個(gè)小故事比較直觀地闡述了模塊化開發(fā)的過程。每個(gè)模塊都由一個(gè)名為的函數(shù)創(chuàng)建。原文出處模塊化開發(fā)的那些事 模塊化開發(fā)在編程開發(fā)中是一個(gè)非常重要的概念,一個(gè)優(yōu)秀的模塊化項(xiàng)目的后期維護(hù)成本可以大大降低。本文主要介紹JavaScript模塊化開發(fā)的那些事,文中通過...
摘要:只是構(gòu)造函數(shù)上的一個(gè)屬性,它是一個(gè)指針,指向原型對(duì)象,并不表示就是原型對(duì)象。在上一個(gè)例子中,就是一個(gè)對(duì)象,這個(gè)對(duì)象可以說是原生構(gòu)造函數(shù)的實(shí)例,所以也是一個(gè)對(duì)象,所以它也有屬性,不過它的指向也就是原型鏈的頂端,再往上就沒有了。 上一篇講了①原型對(duì)象是什么;②__proto__、prototype、constructor的關(guān)系;③原型對(duì)象的作用;④原型對(duì)象帶來的一些需要注意的問題; 沒理解...
摘要:通過同一個(gè)構(gòu)造函數(shù)實(shí)例化的多個(gè)實(shí)例對(duì)象具有同一個(gè)原型對(duì)象。所以當(dāng)給原型對(duì)象賦值一個(gè)新對(duì)象時(shí),切記將原型對(duì)象的指回原構(gòu)造函數(shù)以上就是本次分享的內(nèi)容,關(guān)于原型對(duì)象的其他知識(shí),下一篇基礎(chǔ)原型對(duì)象的那些事二會(huì)講到。 談起js的基礎(chǔ),繞不過去的坎就是:原型鏈、作用域鏈、this(em...好吧,還有閉包),今天總結(jié)一下關(guān)于原型對(duì)象的一些知識(shí),供自己和大家復(fù)習(xí)。 概念理解 什么是原型對(duì)象呢?有以下...
閱讀 3576·2021-10-15 09:43
閱讀 3496·2021-09-02 15:21
閱讀 2208·2021-08-11 11:23
閱讀 3247·2019-08-30 15:54
閱讀 1939·2019-08-30 13:54
閱讀 3208·2019-08-29 18:35
閱讀 679·2019-08-29 16:58
閱讀 1751·2019-08-29 12:49