溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

引用類型-Function類型

發(fā)布時間:2020-07-13 08:48:49 來源:網(wǎng)絡(luò) 閱讀:353 作者:吳金瑞 欄目:網(wǎng)絡(luò)安全

    

Function類型


 

定義函數(shù)的三種方式:

1、函數(shù)聲明

function sum(num1,num2){            return num1 +num2;
        }

2、函數(shù)表達(dá)式

var sum = function(num1,num2){            return num1 + num2;
        }

3、Function構(gòu)造函數(shù)(不推薦)
//最后一個參數(shù)始終都被認(rèn)作函數(shù)體,會導(dǎo)致解析兩次代碼

var sum =new Function("num1","num2","return num1 + num2");

注意:函數(shù)名僅僅是指向函數(shù)的指針,因此函數(shù)名與其他包含對象的指針沒有設(shè)么區(qū)別

 

引用類型-Function類型

function sum(num1,num2){            return num1 + num2;
        }
alert(sum(10,10)); //20var another = sum;
alert(another(10,10)); //20sum = null;
alert(another(10,10)); //20sum和another都指向同一個函數(shù),所以講sum設(shè)置為null并不影響another

引用類型-Function類型

 

注意:使用不帶圓括號的函數(shù)名是訪問函數(shù)指針,并不是調(diào)用函數(shù)

 

沒有重載


 

將函數(shù)名理解為指針有利于理解為什么沒有重載

 

引用類型-Function類型

function addSomeNumber(num){            return num + 100;
        }function addSomeNumber(num){            return num + 200;
        }
alert(addSomeNumber(100)); //300

引用類型-Function類型

 

第二個函數(shù)將addSomeNumber指向新的函數(shù)

 

函數(shù)聲明與函數(shù)表達(dá)式

 


 

 

解析器在向執(zhí)行環(huán)境中加載數(shù)據(jù)時,對函數(shù)聲明和函數(shù)表達(dá)式不是一時同仁。解析器會率先讀取函數(shù)聲明,并使其在執(zhí)新行任何代碼之前可用。對于函數(shù)表達(dá)式,則必須等到執(zhí)行到它所在的代碼行,才會真正被解析。

alert(sum(10.10)); //20function sum(num1,num2){            return num1 +num2;
        }

在代碼執(zhí)行環(huán)境之前,解析器會通過一個名為函數(shù)聲明提升的過程,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境當(dāng)中。對代碼求值時,JavaScript引擎在第一遍會聲明函數(shù)并將它們放到源代碼樹的頂部

alert(sum(10,10));  sum = (num1,num2){             num1 + num2;
        }

 

作為值的函數(shù)

 


 

可以像傳遞參數(shù)一樣把一個函數(shù)傳遞給另一個函數(shù),也可以將一個函數(shù)作為另一個函數(shù)的結(jié)果返回。

 

引用類型-Function類型

function callSomeFunction(someFunction,someArugment){            return someFunction(someArugment);
        }function add10(num){            return num + 10;
        }var result = callSomeFunction(add10,10);
alert(result);//20

引用類型-Function類型

 

可以從一個函數(shù)中返回另一個函數(shù)

引用類型-Function類型

function createComparisonFunction(propertyName){            return function(object1,object2){                var values1 = object1[propertyName];                var values2 = object2[propertyName];                if(values1<values2)                    return -1;                else if(values1>values2)                    return 1;                else
                    return 0;
            };
        }var data = [{name:"qunzhu",age:21},{name:"huishuai",age:22},{name:"kuolang",age:23}];
data.sort(createComparisonFunction(name));
alert(data[1].name); //huishuai

引用類型-Function類型

 

函數(shù)內(nèi)部屬性

 


 

 

在函數(shù)內(nèi)部,有兩個特殊的對象:arguments和this。
arguments他是一個類數(shù)組對象,包含著傳入函數(shù)中所有的參數(shù),他有一個callee屬性,該屬性是一個指針,指向擁有這個arguments對象的函數(shù)。

function factorial(num){            if(num<=1)                return 1;            else
                return num * factorial(num-1);
        }

函數(shù)有一個問題,函數(shù)的執(zhí)行與函數(shù)名耦合在了一起
改進:

引用類型-Function類型

function factorial(num){            if(num<=1)                return 1;            else
                return num * arguments.callee(num-1);
        }var trueFactorial = factorial;
factorial = function(){            return 0;
        }
alert(trueFactorial(5)); //120alert(factorial(5)); //0

引用類型-Function類型

this引用的是函數(shù)數(shù)據(jù)以執(zhí)行的環(huán)境對象或者也可以說是this值(當(dāng)在網(wǎng)頁的全局作用域中調(diào)用函數(shù)時this對象引用的是window)

引用類型-Function類型

window.color = "red";var o = {color:"blue"};function sayColor(){
            alert(this.color);
        }
sayColor(); //redo.sayColor = sayColor;
o.sayColor(); //blue

引用類型-Function類型

ECMAScript5也規(guī)范化了另一個函數(shù)對象的屬性:caller,這個屬性保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用,如果在全局作用域中調(diào)用當(dāng)前函數(shù),則返回null。

引用類型-Function類型

function outer(){
            inner();
        }function inner(){
            alert(inner.caller);
        }
outer();//會彈出警告框,顯示outer()的源代碼

引用類型-Function類型

 

函數(shù)屬性和方法

 


 

 

每個函數(shù)都有兩個屬性:length和prototype
length屬性表示函數(shù)希望接受的命名參數(shù)

function sum(num1,num2){            return num1 + num2;
        }
alert(sum.length); //2

對于ECMAScript中的引用類型而言,prototype是保存他們所有實例方法的真正所在,prototype的屬性是不可枚舉的,因此使用for-in無法發(fā)現(xiàn)


每個函數(shù)都包含兩個非繼承的方法:apply()和call()。這兩個方法的用途都是在指定的作用域中調(diào)用函數(shù),實際上等于設(shè)置函數(shù)體內(nèi)的this對象的值

引用類型-Function類型

function sum(num1,num2){            return num1 + num2;
        }function callSum1(num1,num2){            return sum.apply(this,arguments);
        }function callSum2(num1,num2){            return sum.apply(this,[num1,num2]);
        }
alert(callSum1(10,10)); //20alert(callSum2(10,10)); //20

引用類型-Function類型

call()方法與apply()方法的作用相同,他們的區(qū)別在于接受參數(shù)的方式不同,call()方法,第一個參數(shù)時this值沒有變化,變化的是其余參數(shù)都直接傳遞給函數(shù)。換句話說,在使用call()方法時,傳遞給函數(shù)的參數(shù)必須逐個列舉出來

引用類型-Function類型

function sum(num1,num2){            return num1 + num2;
        }function callSum(num1,num2){             return sum.call(this,num1,num2);
         }
 alert(callSum(10,10)); //20

引用類型-Function類型

 其實call()和apply()真正強大的地方在于能夠擴充函數(shù)賴以運行的作用域

引用類型-Function類型

 window.color = "red"; var o = {color:"blue"}; function sayColor(){
             alert(this.color);
         }
 sayColor(); //red
 sayColor.call(this); //red
 sayColor.call(window); //red
 sayColor.call(o); //blue

引用類型-Function類型

 ECMAScript5還定義了一個方法bind()。這個方法會創(chuàng)建一個函數(shù)的實例,起this值會綁定到傳給bind()函數(shù)的值

引用類型-Function類型

 window.color = "red";var o = {color:"blue"};function sayColor(){
            alert(this.color);
        }var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue

引用類型-Function類型

每個函數(shù)繼承的toLocaleString()和toString()方法會始終返回函數(shù)的代碼。

 


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI