国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript引用類型——“Function類型”的注意要點(diǎn)

fantix / 3274人閱讀

摘要:類型每個(gè)函數(shù)都是類型的實(shí)例。如以上代碼可行,是因?yàn)樵诖a開(kāi)始值錢(qián),解析器就已經(jīng)通過(guò)一個(gè)名為函數(shù)聲明提升的過(guò)程,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境中去。也可同時(shí)使用函數(shù)聲明和函數(shù)表達(dá)式,但在瀏覽器中會(huì)出錯(cuò)。

Function 類型

每個(gè)函數(shù)都是Function 類型的實(shí)例。函數(shù)名實(shí)際上就是一個(gè)指向函數(shù)對(duì)象的指針,不會(huì)與某個(gè)函數(shù)綁定。

函數(shù)聲明方式創(chuàng)建Function,語(yǔ)法如下:

function sum(x,y){
    return x + y;
}

函數(shù)表達(dá)式定義Function,用var 如下:

var sum = function(x,y){
    return x + y;
};

第二種方法不要忘記在結(jié)尾加上分號(hào)

另外還可以使用Function 構(gòu)造函數(shù)。如:

var sum = new function("x","y","return x + y");

非常不推薦使用這種形式。

如何證明函數(shù)名僅僅是指向函數(shù)的指針呢:

var sum = function(x,y){
    return x + y;
};
console.log(sum(1,2)); //3

var anotherSum = sum;
console.log(anotherSum(1,1)); //2

sum = null;
console.log(anotherSum(10,10)); //20
沒(méi)有重載

同名的后面的函數(shù)將會(huì)覆蓋前面的函數(shù)。如:

function add(num){
    return num + 100;
}
function add(num){
    return num + 200;
}
console.log(add(100)); //300

用另外一種寫(xiě)法就可以很清楚的看出原因。如:

var add = function(num){
    return num + 100;
}
add = function(num){
    return num + 200;
}
console.log(add(100)); //300
函數(shù)的聲明與函數(shù)表達(dá)式(以及函數(shù)聲明提升)

解析器會(huì)率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用(可訪問(wèn));至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行,才會(huì)真正被解釋執(zhí)行。如:

console.log(sum(1,1)); //2
function sum(x,y){
    return x + y;
}

以上代碼可行,是因?yàn)樵诖a開(kāi)始值錢(qián),解析器就已經(jīng)通過(guò)一個(gè)名為函數(shù)聲明提升(function declaration hoisting)的過(guò)程,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境中去。即使聲明函數(shù)的代碼在調(diào)用它的代碼后面,JavaScript 引擎也能把函數(shù)聲明提升到頂部。

但是,如果把函數(shù)聲明改成函數(shù)表達(dá)式,則會(huì)導(dǎo)致錯(cuò)誤。如:

console.log(sum(1,1)); 
var sum = function(x,y){
    return x + y;
}; //TypeError: undefined is not a function (evaluating "sum(1,1)")

失敗的原因就在于函數(shù)位于初始化語(yǔ)句中,而不是一個(gè)函數(shù)聲明。

也可同時(shí)使用函數(shù)聲明和函數(shù)表達(dá)式,但在safari 瀏覽器中會(huì)出錯(cuò)。

作為值的函數(shù)

函數(shù)也可以作為值來(lái)使用,也就是可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回。如

function callFunction(someFunction,someArgument){
    console.log(someFunction(someArgument));
}
function addNum(x){
    return x + 100;
}
callFunction(addNum,100); //200

要訪問(wèn)函數(shù)的指針而不執(zhí)行函數(shù)的話,必須去掉函數(shù)名后面的括號(hào)。

function compare(func,x,y){
    var num1 = func(x);
    var num2 = func(y);
    var array = [num1,num2];
    
    var result = array.sort(sortFunc);
    console.log(result.toString());
    document.write(result.join(" then "));
    
    
    function sortFunc(value1,value2){
        if (value1 > value2){
            return 1;
        }else if(value2 > value1){
            return -1;
        }else{
            return 0;
        }
    }
}

function add10(num){
        return num + 10;
    }

compare(add10,10000,999100); //10010 then 999110
函數(shù)內(nèi)部屬性

這里主要說(shuō)一下callee屬性、this屬性以及caller屬性。

callee屬性的功能就是消除函數(shù)名的耦合問(wèn)題。如:

function min(num){
    if(num == 1){
        return 1;
    }else if(num < 1){
        return 0;
    }else{
        return min(num - 1);
    }
}

var result = min(100);
document.write(result);

上面這個(gè)min()函數(shù)如果改了函數(shù)名,函數(shù)里面也相應(yīng)的需要修改函數(shù)名。但添加了callee屬性,就不需要修改。如:

function mins(num){
    if(num == 1){
        return 1;
    }else if(num < 1){
        return 0;
    }else{
        return arguments.callee(num - 1);
    }
}

var result = mins(100);
document.write(result);

著就解決了耦合現(xiàn)象所帶來(lái)的問(wèn)題。

this這個(gè)特殊對(duì)象的作用與Java 和C# 中的this 類似。this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象——或者this值。如:

window.color = "red";
var obj = {color: "yellow"};

function show(){
    document.write(this.color);
}

show(); //red

obj.show = show;
obj.show(); //yellow

caller用來(lái)調(diào)用當(dāng)前函數(shù)的函數(shù)的引用(源代碼)。如:

function sum(x,y){
    plus(x,y);
}

function plus(x,y){
    console.log(x + y);
    document.write("
" + plus.caller + "
"); } sum(10,20);

如:

(
    function a(){
        document.write("function a");
        b();
        function b(){
            document.write("function b");
            alert(arguments.callee.caller);
        }
    }
)()

用arguments.callee 可能在某些瀏覽器中會(huì)導(dǎo)致錯(cuò)誤:

function sum(x,y){
    plus(x,y);
}

function plus(x,y){
    console.log(x + y);
    document.write("
" + arguments.callee.caller + "
"); } sum(10,20);
函數(shù)屬性和方法

每個(gè)函數(shù)都包含兩個(gè)屬性lengthprototype

length屬性中,將返回參數(shù)的個(gè)數(shù)。如:

function colors(color1,color2){
    var array = [color1,color2];
    document.write(array.join("/"))
}
colors("red","blue");
document.write(" " + colors.length + "個(gè)參數(shù)"); //red/blue 2個(gè)參數(shù)

又如:

function toStr(){
        var result = "";
        for (var i = 0; i < arguments.length; i ++){
            result += arguments[i].toString() + " ";
        }
        document.write(result);
        document.write(" " + arguments.length + "個(gè)參數(shù)" + "
"); document.write(" " + arguments.callee.length + "個(gè)函數(shù)期望參數(shù)"); } toStr(321,32,43243,432,3213); /* 321 32 43243 432 3213 5個(gè)參數(shù) 0個(gè)函數(shù)期望參數(shù) */

prototype屬性。這個(gè)屬性是保存它們所有實(shí)例方法的真正所在。在創(chuàng)建自定義引用類型以及實(shí)現(xiàn)繼承時(shí),這個(gè)屬性是非常重要的(以后再多帶帶討論)。另外,在ECMAScript 5 中,這個(gè)屬性不可枚舉(不能用for-in)。主要的兩個(gè)非繼承方法有apply()call();這兩個(gè)方法的用途都是在特定的作用域中調(diào)用函數(shù)。

apply()方法接收兩個(gè)參數(shù):一個(gè)是在其中運(yùn)行函數(shù)的作用域,另一個(gè)是參數(shù)數(shù)組。第二個(gè)參數(shù)可以是Array 的實(shí)例,也可以是arguments 對(duì)象。如:

function sum(x,y){
    document.write(x.toString() + y.toString());
}

function plus(){
    return sum.apply(this,arguments);
}

plus(321,"fff");

下面這個(gè)則是Array 的實(shí)例:

function sum(x,y){
    document.write(x.toString() + y.toString());
}

function plus(a,b){
    return sum.apply(this,[a,b]);
}

plus(321,"fff"); 

call()方法與前者的作用相同,區(qū)別在于接收參數(shù)的方式不同。第二個(gè)參數(shù)必須一個(gè)個(gè)列舉出來(lái)。如下:

function sum(x,y){
    document.write(x.toString() + y.toString());
}

function plus(a,b){
    return sum.call(this,a,b);
}

plus(321,"fff");

上面例子中plus(a,b) 不能寫(xiě)成plus();call(this,a,b)不能寫(xiě)成call(this,arguments)call(this,[a,b])

高能!!!

高能!!!

事實(shí)上,apply()call()真正有價(jià)值的用途是擴(kuò)充函數(shù)的作用域。如:

var child = {
    name: "Oliver",
    age: 18
}
var adult = {
    name: "Troy",
    age: 24
}

function showName(){
    document.write(this.name);
}

showName.call(adult); //Troy
showName.call(child); //Oliver

使用上面這兩個(gè)方法來(lái)擴(kuò)充作用域的最大好處就是對(duì)象不需要與方法又任何耦合關(guān)系。

ECMAScript 5 還定義了一個(gè)方法:bind()。this 的值會(huì)被綁定到傳給bind()函數(shù)的值。如:

var child = {
    name: "Oliver",
    age: 18
}
var adult = {
    name: "Troy",
    age: 24
}

function showName(){
    document.write(this.name);
}

var newFunc = showName.bind(child);
newFunc(); //Oliver

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86230.html

相關(guān)文章

  • Javascript變量注意要點(diǎn)

    摘要:如很明顯可以看到,實(shí)際上是函數(shù)的局部變量。簡(jiǎn)單的說(shuō)就是,復(fù)制給參數(shù),在函數(shù)內(nèi)部是局部變量,無(wú)論怎么變化,都不影響的變化。 ECMAScript 變量可能包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值。 基本類型和引用類型的值 基本類型值(String,Number,Boolean,Null,Undefined)指的是簡(jiǎn)單的數(shù)據(jù)段;引用類型值(保存在內(nèi)存中的對(duì)象)指的是那些可能由多個(gè)值...

    booster 評(píng)論0 收藏0
  • Javascript引用類型——“Object類型注意要點(diǎn)

    摘要:類型關(guān)于引用類型的概念引用類型引用類型的值對(duì)象是引用類型的一個(gè)實(shí)例對(duì)象是某個(gè)特定引用類型的實(shí)例新對(duì)象用操作符后跟一個(gè)構(gòu)造函數(shù)來(lái)創(chuàng)建的如代碼這行代碼創(chuàng)建了引用類型的一個(gè)新實(shí)例,然后把該實(shí)例保存在了變量中。使用的構(gòu)造函數(shù)是。 Object 類型 關(guān)于引用類型的概念: 引用類型:引用類型的值(對(duì)象)是引用類型的一個(gè)實(shí)例; 對(duì)象:是某個(gè)特定引用類型的實(shí)例; 新對(duì)象:用new 操作符后跟一個(gè)構(gòu)...

    Codeing_ls 評(píng)論0 收藏0
  • JavaScript引用類型——“單體內(nèi)置對(duì)象”注意要點(diǎn)

    摘要:?jiǎn)误w內(nèi)置對(duì)象單體內(nèi)置對(duì)象就是開(kāi)發(fā)人員不必顯式地實(shí)例化內(nèi)置對(duì)象,因?yàn)樗麄円呀?jīng)實(shí)例化了。前面的章節(jié)討論過(guò)了大多數(shù)內(nèi)置對(duì)象,還定義了兩個(gè)單體內(nèi)置對(duì)象和。 單體內(nèi)置對(duì)象 單體內(nèi)置對(duì)象就是開(kāi)發(fā)人員不必顯式地實(shí)例化內(nèi)置對(duì)象,因?yàn)樗麄円呀?jīng)實(shí)例化了。前面的章節(jié)討論過(guò)了大多數(shù)內(nèi)置對(duì)象,ECMA-262 還定義了兩個(gè)單體內(nèi)置對(duì)象:Global 和Math。 Global 對(duì)象 所有在全局作用域中定義的屬性...

    xushaojieaaa 評(píng)論0 收藏0
  • JavaScript 代碼優(yōu)化和部署——“可維護(hù)性”注意要點(diǎn)

    摘要:代碼約定可讀性以下地方需要進(jìn)行注釋函數(shù)和方法注釋參數(shù)代表什么,是否有返回值大段代碼描述任務(wù)的注釋復(fù)雜的算法變量和函數(shù)命名變量用名詞函數(shù)名用動(dòng)詞開(kāi)頭等返回布爾值類型的函數(shù)用等合乎邏輯不用擔(dān)心太長(zhǎng)變量類型透明化方法一初始化,如下推薦方法二匈牙利 代碼約定 可讀性 以下地方需要進(jìn)行注釋: 函數(shù)和方法:注釋參數(shù)代表什么,是否有返回值; 大段代碼:描述任務(wù)的注釋; 復(fù)雜的算法; Hack 變...

    scwang90 評(píng)論0 收藏0
  • JavaScript引用類型——“Date類型注意要點(diǎn)

    摘要:類型中的類型使用自,國(guó)際協(xié)調(diào)時(shí)間年月日午夜零時(shí)開(kāi)始經(jīng)過(guò)的毫秒數(shù)來(lái)保存日期。類型保存的日期能夠精確到年月日之前或之后的年。和的輸出因?yàn)g覽器不同而有所差異如年月日上午方法可用比較操作符來(lái)比較日期值。 Date 類型 ECMAScript 中的Date 類型使用自UTC(Coordinated Universal Time,國(guó)際協(xié)調(diào)時(shí)間)1970 年1 月1 日午夜(零時(shí))開(kāi)始經(jīng)過(guò)的毫秒數(shù)來(lái)...

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

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

0條評(píng)論

fantix

|高級(jí)講師

TA的文章

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