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