摘要:類型是提供的引用類型之一,通過可需變更創建對象。調用自身的函數被稱之為遞歸函數。想要解決上述遞歸函數的問題,可以使用對象屬性替換具體的函數名。保護貢獻的局部變量。
Function類型 概述
Function與函數
函數是這樣的一段JavaScript代碼,她只定義一次,但是可能被執行或調用多次。
Function類型是JavaScript提供的引用類型之一,通過Function可u需變更創建對象。
在JavaScript中,函數也是以對象形式存在的。每一個函數都是一個Function對象。函數名,本質就是一個變量,是指向某個Function對象的引用。
function fn(){
console.log(‘臥龍學院’);
}
console.log (fn instanceof Function);//true
構造函數
在JavaScript中,函數除了可以通過函數定義語句或字面量變大時兩個方式意外,還可以通過Function類型進行定義:
var add = new Function(
"num1".
"num2",
)
注意:通過Function類型定義函數的效率遠不如通過函數定義或者字面量定義表達式兩個方式定義,目前,定義函數具有三種表達式。
Function的apply()方法
Function的apply()方法用于調用一個函數,并且接受指定的this值,以及一個數組作為參數。其語法如下結構:
func.apply(thisarg,[argsarray])
this參數:可選項,在func函數運行時使用的this值。
argsarray參數:可選項,一個數組或者類數組對象,其中的數組元素將作為多帶帶的參數傳給func函數。也可以使用argumengts對象作為該參數。
返回值調用該函數的返回結果。
Function的call()方法
Function的call()方法用于調用一個函數,并且接受指定的this值作為參數,以及參數列表。
thisarg參數:在func函數運行時使用的this值。arg1 arg2 參數:指定參數列表
返回值:調用該函數的返回結果。
apply()于call()非常相似,不同之處在于提供參數的方法
Functiond 的bind()方法
Function的bind()方法用于創建一個新的函數(稱之為綁定函數),并且接受指定的this值作為參數,以及參數列表。其語法結果如下:
fun。bind(thisarg[[arg[,arg[,arg2]]])
thisarg參數:當綁定函數被調用時,該參數會作為原函數運行時的this指向,
arg1,arg2,參數。。。當綁定函數被調用時,這些參數將設置于實參之前傳遞給被綁定的方法。
返回值:返回又指定的this值和初始化參數改造的原函數拷貝。
沒有重載
在其他開發語言中,函數具有一種特性,叫做重載。所謂重載,就是定義多個同名函數,但每一個函數接受的參數的個數不同,程序會根據調用實參個數進行判斷,具體調用的是那個函數。如下是列:
function add (a,b){
return a+b;
}
function add (a,b,c){
return a+b+c;
}
add(1,2);//3
add(1,2,3);//6
但是在JavaScript中,函數是沒有重載現象的。也就是說,如果用是定義多個同名的函數,只有最后一個定義的函數是有效的。
不過,JavaScript提供了arguments對象,該對象可以模型函數重載的現象。arguments對象時函數內部的本地變量;argumengts以及不再時函數的屬性了。argumengts對象可以獲取函數的所有參數,但argumengts對象并不是一個數組,而是一個類數組對象
遞歸
在一個函數的函數體內,如果想調用自身函數的話,有如下兩種方式:
通過使用自身函數名實現。
通過使用arguments對象的callee屬性實現。
調用自身的函數被稱之為遞歸函數。在某種意義上說,遞歸近似于循環。兩者都重復執行相同的代碼,并且兩者都需要一個終止條件以避免無限循環或者無限遞歸。
function loop(x){
if(x>=10){ return;}
loop(x+1);
}
loop(0);
上述代碼是一個經典的遞歸函數。雖然這個函數表面看起來并沒有什么問題,如果直線下述代碼可能會導致出錯。
car anotherloop = loop ;
loop = null ;
anotherLoop (0)// 出錯
上述代碼將函數loop()保存到另一個變量anotherloop中,然后將loop設置為null值。當執行another loop時,一定會執行函數loop(),而loop已經不再是一個函數,最終導致出錯。
想要解決上述遞歸函數的問題,可以使用arguments對象callee屬性替換具體的函數名。
function loop (x) {
if (x>=10){
return;
}
arguments.callee(x+1);
}
匿名函數
JavaScript可以將函數作為數據使用。作為函數本體,它像普通的數據一樣,不一定要有名字。默認名字的函數被定之為匿名函數。如下實例:
function(a){return a;}
匿名函數的兩種使用方法:
可以將匿名函數作為函數作為參數傳遞給其他函數。這樣,接受方函授就能利用所傳遞的函數來完成某些事情。
可以定義某個匿名函數來執行某些一次性任務。
回調函數
當一個函數作為參數傳遞給另一個函數時,作為參數的函數被稱之為回調函數。
function add(a,breturn a ()+b()} var one = function () {return1;}
var two = function(){return 2;}
console.log (add(one,two));//output 3}
可以直接使用匿名函數來替代one()和two(),以作為目標函數的參數
console。log (add(function(){return 1;}, function(return2;)))
上述代碼中。函數one()two()都作為函數add()的參數傳遞。所有one()和two()都是回調函數。當將函數A傳遞給函數B,并由B來執行A時,A就成了一個回調函數。 如果A 還是一個無名函數 就稱之為匿名會點函數。 回調函數的優點如下:
它可以在不做命名的情況下傳遞函數(這意味著可以節省全局變量)。
可以將一個函數調用操作委托給另一個函數()這意味著可以節省一些代碼編寫工作。
回調函數也有助于提升性能
自調函數
所謂自掉函數就是定義函數后自行調用。如下實例:
(function(){console.log("javascript");
})();
上述代碼的含義:第一對 括號的作用,放置的時一個匿名函數。
第二隊括號的作用,時’立即調用‘。
自調函數只需要將匿名函數的定義放進一對括號中, 然后外面再跟一對括號即可。
自調函數也可以再調用時接受參數。如下示例:
(function(name){
console.log("hello"+name+"!");
})(""jacasript);//hello javasript
上述代碼的含義如下:
當一個括號中的匿名函數接受一個參數。
第二個括號,再調用時, 像匿名函數傳遞參數內容。
作為值的函數
將一個函數作為另一個函數的結果進行返回,作為結果返回的函數稱之為作為值的函數。
function fn( f,args){
return f (ars);
}
function add(num){//作為值的函數
return num +10;
}
var result = fn(add,10);
console.log (result);//20
上述代碼還可以編寫成如下方式:
function fn(args){
return function add(){
return args +10
}
}
上述兩段代碼的區別在于:
var f = fn(10); //function add(){return 10+10;}
var result =f()//20
作用域鏈
很多開發語言中都具有塊級作用域,但ECMAScript5版本中并沒有跨級作用域,這經常會導致理解上的困惑。如下示例:
if (true){
var color= ‘blue’;
}
console。log(color);//blue
上述代碼再if語句中的定義了變量color。但該變量的作用域時全局域,原因是ECMASript5版本中沒有塊級作用域。
雖然再ECMASript5版本沒有塊級作用域。但具有函數作用域。在某個函數內部定義的變量的作用域就是該函數的作用域。
function fun(){
var v = this is "wolongxueyuan ";
}
console .log (v)//輸出報錯
上述代碼在函數fun內部定義了變量v ,該變量的作用域是fun函數的作用域。 所以在全局域訪問該變量時會報錯。每一段JavaScript代碼(全局代碼或函數)都有一個與值關聯的作用域鏈。 這個作用或鏈式一個對象列表或鏈表,這組對象定義了這段代碼作用域中的變量。
閉包是什么
JavaScript允許函數嵌套,并且內部函數可以訪問定義在外部函數中的所有變量函數,已經外部函數能訪問的所有變量和函數。但是,外部函數作用域訪問時,一個閉包就產生了。
閉包就是詞法表示包括不必計算的變量的函數, 也就是說, 該函數能使用函數外定義的變量
如下述代碼就是一個最簡單形式的閉包結構:
var b ;
function f(){
var a=" a"};
b=function(){
returnn a+"b";
}
return a;
}
//測試
console.log (f());//a
console.log(b());//ab
閉包的特點
局部變量;在函數中定義有貢獻意義 的局部變量。()定義成全局變量會對外造成污染
內部函數:在函數(f)中聲明有內嵌函數,內嵌函數(g)對函數(f)中的局部變量進行訪問。
外部使用:函數(f)向外返回詞內嵌函數(g),外部可以通過詞內嵌函數持有并訪問聲明在函數(f) 中的局部變量,而此變量在外部時通過其他途徑無法訪問的。
閉包作用:
提供可共享的局部變量。
保護貢獻的局部變量。提供專門的讀寫變量的函數。
避免全局污染
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108265.html
摘要:給的實例注入一個的屬性,這也就是為什么我們在的組件中可以通過訪問到的各種數據和狀態源碼位置,是怎么實現的源碼位置是對的的初始化,它接受個參數,為當前實例,為的,為執行的回調函數,為當前模塊的路徑。 20190221 請簡述一下vuex實現原理 對vuex基礎概念有不懂的可以點這里 vuex實現原理我們簡單過一遍源碼 地址 https://github.com/vuejs/vuex 首...
摘要:首先變量對于一個程序來說是一個很重要的角色那么問題來了這些變量存在哪里程序用到的時候如何找到變量呢所以需要一套規則來存儲變量方便之后再找到這套規則就成為作用域是一門編譯語言對于來說大部分情況下編譯發生在代碼執行前的幾微妙的時間內對于參與到一 首先,變量對于一個程序來說是一個很重要的角色, 那么問題來了 這些變量存在哪里,程序用到的時候如何找到變量呢? 所以需要一套規則來存儲變量方便之后...
閱讀 1970·2019-08-30 15:54
閱讀 3596·2019-08-29 13:07
閱讀 3123·2019-08-29 12:39
閱讀 1789·2019-08-26 12:13
閱讀 1547·2019-08-23 18:31
閱讀 2158·2019-08-23 18:05
閱讀 1843·2019-08-23 18:00
閱讀 1042·2019-08-23 17:15