成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript函數(shù)(二)

用戶84 / 2819人閱讀

摘要:目錄函數(shù)的聲明函數(shù)的屬性和方法函數(shù)的作用域閉包知識(shí)點(diǎn)小結(jié)關(guān)于函數(shù),可以從以下個(gè)方面去理解首先,數(shù)據(jù)類型上看函數(shù)在中是一種數(shù)據(jù)類型,是對(duì)象的一種其次,從功能上看函數(shù)本質(zhì)上是一段反復(fù)調(diào)用的代碼塊最后,從地位上看函數(shù)在中和其他基本數(shù)據(jù)類型一樣,可

目錄 1.函數(shù)的聲明 2.函數(shù)的屬性和方法 3.函數(shù)的作用域 4.閉包知識(shí)點(diǎn) 5.小結(jié)

關(guān)于函數(shù),可以從以下3個(gè)方面去理解:
首先,數(shù)據(jù)類型上看:函數(shù)在JavaScript中是一種數(shù)據(jù)類型,是對(duì)象的一種;
其次,從功能上看:函數(shù)本質(zhì)上是一段反復(fù)調(diào)用的代碼塊;
最后,從地位上看:函數(shù)在JavaScript中和其他基本數(shù)據(jù)類型一樣,可以作為參數(shù)和賦值,是“第一等公民”

1.函數(shù)的聲明

聲明函數(shù)的方式有三種:

1.聲明式
function fn(){
  console.log(1)
}
fn()//1
2.表達(dá)式
var fn = function(args){
    console.log(args)
}
fn(a)//a
3.構(gòu)造函數(shù)式
var fn =  new Function("arg1","arg2","return arg1+arg2")
fn(1,2)//3

函數(shù)本質(zhì)上是對(duì)象的一種,所以函數(shù)名保存的實(shí)際上是指向函數(shù)對(duì)象的指針,第3種構(gòu)造函數(shù)的方法對(duì)于理解“函數(shù)是對(duì)象,函數(shù)名是指針”的概念更加直觀,但是第3種方法解析效率較低而且書寫不簡潔,所以一般不用構(gòu)造函數(shù)方法去聲明函數(shù);
當(dāng)聲明式和表達(dá)式同時(shí)聲明同一個(gè)函數(shù)時(shí),表達(dá)式會(huì)覆蓋聲明式,原因是函數(shù)作為變量在js解析階段進(jìn)行變量提升,聲明式和表達(dá)式都會(huì)提升至當(dāng)前作用域頭部,然后表達(dá)式會(huì)重新為fn賦值,從而覆蓋聲明式定義的函數(shù);

function fn(){
  console.log(1)
}
var fn = function(){
  console.log(2)
}
fn()//2

關(guān)于return語句的理解,如果聲明的函數(shù)沒有return語句,則默認(rèn)return undefined,否則返回定義的值;

var a  = function(){
    console.log(1)
}
var b = function(){
    return 2;
}
a() === undefined//true
2.函數(shù)的屬性和方法

函數(shù)作為一個(gè)對(duì)象,同樣擁有屬性和方法,下面主要?dú)w納一下比較常用和重要的屬性和方法:

name屬性:返回該函數(shù)名的字符串;

length屬性:返回形參的個(gè)數(shù),即預(yù)期傳入?yún)?shù)的個(gè)數(shù);

function fn (a,b){
    console.log(fn.name)
    console.log(fn.length)
}
fn()
//"fn"  
//2

arguments對(duì)象:是包含傳入函數(shù)實(shí)參的類數(shù)組對(duì)象,只有在函數(shù)執(zhí)行階段并且存在參數(shù)才會(huì)有值,未調(diào)用函數(shù)是為null;

function fn (a,b){
  console.log(arguments)
}
fn(1,2)
//[1,2]


arguments對(duì)象的length屬性代表實(shí)參的個(gè)數(shù),注意和函數(shù)的length屬性的區(qū)別,函數(shù)的length代表形參的個(gè)數(shù),arguments的length屬性代表實(shí)參個(gè)數(shù);
arguments對(duì)象有一個(gè)callee屬性,返回arguments對(duì)象所在的函數(shù)指針;

可以利用callee實(shí)現(xiàn)函數(shù)的遞歸,例如累加或階乘操作:

function increment(arg){
  if(arg === 1){
    return 1
  }
  return arg+arguments.callee(arg-1)
}
function increMultipler(arg){
  if(arg === 1){
    return 1
  }
  return arg*arguments.callee(arg-1)
}


這里另外提一個(gè)函數(shù)的caller屬性,該屬性保存調(diào)用當(dāng)前函數(shù)的函數(shù)的引用,注意的是如果在全局作用域下讀取該屬性,值為null,因?yàn)轫攲訉?duì)象在瀏覽器中為window不是函數(shù);

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

this對(duì)象:代表函數(shù)執(zhí)行時(shí)的環(huán)境對(duì)象,簡單的說就是誰調(diào)用了該函數(shù),this的指向是動(dòng)態(tài)的,只有在函數(shù)調(diào)用時(shí)this對(duì)象才能確定;

//在瀏覽器全局環(huán)境下,即window對(duì)象下
var print = function(){
      console.log(this)
 }
print()//this指向Window,因?yàn)檫@是Window對(duì)象調(diào)用了print方法
//在特定對(duì)象的環(huán)境下
var o = {
    print: function(){
      console.log(this)
  }
}
o.print()//this指向o,因?yàn)檫@是o對(duì)象調(diào)用print方法

函數(shù)提供callapplybind3種方法可以改變this對(duì)象;

1.call方法
function fn(){
    return this
}
var o = {}
fn() === this//true,this指向window對(duì)象
fn.call(o) === o//true,this指向o對(duì)象
//call方法還可以傳入?yún)?shù);
function add(x,y){
  return x+y
}
add.call(null,1,2)
2.apply方法,與call不同的是apply傳入的參數(shù)為數(shù)組
var arr = [1,2]
function add(x,y){
  return x+y
}
add.apply(null,arr)

實(shí)際上,apply和call的區(qū)別只在于傳遞參數(shù)的不同,它們真正強(qiáng)大的地方在于能夠擴(kuò)充函數(shù)賴以運(yùn)行的作用域,比如slice函數(shù)原本只存在于數(shù)組當(dāng)中,當(dāng)中通過使用call方法,可以實(shí)現(xiàn)不同作用域下調(diào)用該方法;

function fn(a,b){
      console.log(Array.prototype.slice.call(arguments))
 }
fn(1,2)//[1,2]

bind方法會(huì)創(chuàng)建一個(gè)函數(shù)實(shí)例,并將該函數(shù)的this對(duì)象綁定到傳入該方法的參數(shù);

function fn(){
    return this
}
var o = {}
var newFn =fn.bind(o) 
newFn() === o//true
更多this的相關(guān)介紹,詳見【what"s this???】 3.函數(shù)的作用域

作用域指的是變量存在的范圍,作用域可分為全局作用域和局部作用域,變量在全局范圍可訪問到;局部作用域由函數(shù)所構(gòu)造,變量只能在函數(shù)內(nèi)部可訪問到;

var a =1//a處于全局作用域

function fn(){
   var a = 2//a處于局部作用域,外部無法訪問;
  return a;
}
a//1
fn()//2

值的注意的是,函數(shù)執(zhí)行時(shí)所在的作用域是定義時(shí)所在的作用域,而不是調(diào)用時(shí)所在的作用域;

var a = 1;
function fn(){
  console.log(a)
}
function fn2(){
  var a = 2;
  fn()
}
fn2()//1
4. 閉包知識(shí)點(diǎn)

關(guān)于閉包的知識(shí)點(diǎn),將會(huì)多帶帶開一章節(jié)詳談,具體請(qǐng)看《JavaScript閉包(三)》

5.小結(jié)

通過《JavaScript函數(shù)(二)》,我們大致了解關(guān)于函數(shù)的知識(shí)點(diǎn)如下:

函數(shù)本質(zhì)上是一段反復(fù)調(diào)用的代碼塊,是對(duì)象的一種,在js中作為“第一等公民”,可以賦值和傳參;

函數(shù)聲明的方法有3種:聲明式、表達(dá)式和構(gòu)造函數(shù)式;其中構(gòu)造函數(shù)是能夠直觀理解函數(shù)的“函數(shù)是對(duì)象,函數(shù)名是指針”的概念;當(dāng)表達(dá)式和聲明式同時(shí)聲明同名函數(shù)時(shí),表達(dá)式會(huì)覆蓋聲明式,原因是變量提升的作用;

函數(shù)作為對(duì)象,同樣具有屬性和方法;name返回該函數(shù)名的字符串,length返回形參的個(gè)數(shù);

arguments對(duì)象是包含傳入函數(shù)的實(shí)參的類數(shù)組對(duì)象,只有在執(zhí)行階段該對(duì)象才有值,未調(diào)用函數(shù)時(shí)為null,arguments.length表示實(shí)參的個(gè)數(shù),arguments.callee返回arguments對(duì)象所在的函數(shù)的指針;

函數(shù)的caller返回調(diào)用當(dāng)前函數(shù)的函數(shù)的指針,在全局作用域下讀取該屬性為null;

this對(duì)象代表當(dāng)前函數(shù)執(zhí)行時(shí)的環(huán)境對(duì)象,this對(duì)象只有在函數(shù)執(zhí)行階段才能確定;

可以使用call、apply和bind改變this的指向;call和apply的區(qū)別在于二者傳遞的參數(shù)不同,call為零散的數(shù)據(jù),apply為數(shù)組,二者最大的用處是擴(kuò)展函數(shù)的作用域;bind方法可以返回一個(gè)函數(shù)的實(shí)例,并綁定this對(duì)象至傳入bind的參數(shù);

函數(shù)可以開辟一個(gè)獨(dú)立的作用域,這使得js當(dāng)中經(jīng)典的閉包得以實(shí)現(xiàn)提供可能性;此外,函數(shù)執(zhí)行時(shí)所在的作用域是在定義時(shí)所在的作用域,而不是調(diào)用時(shí)所在的作用域;

參考資料

《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》

《JavaScript標(biāo)準(zhǔn)參考教程》——阮一峰

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86582.html

相關(guān)文章

  • 使用javascript實(shí)現(xiàn)排序叉樹(1)

    摘要:使用實(shí)現(xiàn)排序二叉樹排序二叉樹的定義二叉樹的基礎(chǔ)上,左節(jié)點(diǎn)比父節(jié)點(diǎn)要小,右節(jié)點(diǎn)比父節(jié)點(diǎn)要大的二叉樹,叫排序二叉樹。下期內(nèi)容實(shí)現(xiàn)排序二叉樹的中序前序后續(xù)遍歷實(shí)現(xiàn)二叉樹的節(jié)點(diǎn)查找功能實(shí)現(xiàn)排序二叉樹的刪除節(jié)點(diǎn)功能應(yīng)用排序二叉樹實(shí)現(xiàn)一個(gè)小游戲 使用javascript實(shí)現(xiàn)排序二叉樹(1) 排序二叉樹的定義: 二叉樹的基礎(chǔ)上,左節(jié)點(diǎn)比父節(jié)點(diǎn)要小,右節(jié)點(diǎn)比父節(jié)點(diǎn)要大的二叉樹,叫排序二叉樹。 show...

    Caicloud 評(píng)論0 收藏0
  • 談?wù)?em>javascript語法里一些難點(diǎn)問題(

    摘要:講作用域鏈?zhǔn)紫纫獜淖饔糜蛑v起,下面是百度百科里對(duì)作用域的定義作用域在許多程序設(shè)計(jì)語言中非常重要。原文出處談?wù)務(wù)Z法里一些難點(diǎn)問題二 3) 作用域鏈相關(guān)的問題 作用域鏈?zhǔn)莏avascript語言里非常紅的概念,很多學(xué)習(xí)和使用javascript語言的程序員都知道作用域鏈?zhǔn)抢斫鈐avascript里很重要的一些概念的關(guān)鍵,這些概念包括this指針,閉包等等,它非常紅的另一個(gè)重要原因就...

    Enlightenment 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式():策略模式

    摘要:策略模式實(shí)現(xiàn)的也是類似的場景。第二個(gè)部分是環(huán)境類不變,接收客戶的請(qǐng)求,隨后把請(qǐng)求委托給某一個(gè)策略類。參考文章設(shè)計(jì)模式設(shè)計(jì)模式與開發(fā)實(shí)踐設(shè)計(jì)模式系統(tǒng)講解與應(yīng)用本文首發(fā),期待作者以樂之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVbugi7?w=800&h=600); 策略模式:定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且...

    荊兆峰 評(píng)論0 收藏0
  • 進(jìn)擊JavaScript之()詞法作用域與作用域鏈

    摘要:一作用域域表示的就是范圍,即作用域,就是一個(gè)名字在什么地方可以使用,什么時(shí)候不能使用。概括的說作用域就是一套設(shè)計(jì)良好的規(guī)則來存儲(chǔ)變量,并且之后可以方便地找到這些變量。 一、作用域 域表示的就是范圍,即作用域,就是一個(gè)名字在什么地方可以使用,什么時(shí)候不能使用。想了解更多關(guān)于作用域的問題推薦閱讀《你不知道的JavaScript上卷》第一章(或第一部分),從編譯原理的角度說明什么是作用域。概...

    denson 評(píng)論0 收藏0
  • 細(xì)數(shù) JavaScript 實(shí)用黑科技()

    摘要:前言書接上文細(xì)數(shù)實(shí)用黑科技一本文介紹獨(dú)孤九劍和兩篇最高內(nèi)功心法??梢詫⒆兞哭D(zhuǎn)換為布爾值。可以把任何類型的值轉(zhuǎn)換為布爾值,并且只有當(dāng)這個(gè)變量的值為的時(shí)候才會(huì)返回,其他情況都返回。同樣的,函數(shù)體內(nèi)部聲明的函數(shù),作用域綁定函數(shù)體內(nèi)部。 showImg(https://segmentfault.com/img/remote/1460000016507838); 前言 書接上文:細(xì)數(shù) JavaS...

    馬忠志 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)總結(jié)()數(shù)組和對(duì)象部分

    摘要:屬性是一個(gè)值或一組值以數(shù)組或?qū)ο蟮男问?,是?duì)象的成員??梢允褂脙?nèi)置構(gòu)造函數(shù)和創(chuàng)建包裝對(duì)象。因此下面的代碼將會(huì)使人很迷惑結(jié)果結(jié)果,此數(shù)組長度為應(yīng)該盡量避免使用數(shù)組構(gòu)造函數(shù)創(chuàng)建新數(shù)組。給數(shù)組對(duì)象添加返回?cái)?shù)組中最大元素值的方法。 對(duì)象部分 Object類型 Object 是一個(gè)無序的集合,可以存放任意類型對(duì)象,所有其他對(duì)象都繼承自這個(gè)對(duì)象。創(chuàng)建Object類型有兩種,一種是使用new運(yùn)算符,...

    Lsnsh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<