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

資訊專欄INFORMATION COLUMN

JavaScript紅寶書筆記(七)---Function類型

cyrils / 807人閱讀

摘要:函數(shù)實際上是對象。所以需要消除這種緊耦合。函數(shù)內(nèi)部屬性引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象或者也可以說是值函數(shù)的名字僅僅是一個包含指針的變量而已。因此,即使是在不同的環(huán)境中執(zhí)行,全局的函數(shù)與函數(shù)指向的仍然是同一個函數(shù)。

1.函數(shù)實際上是對象。每個函數(shù)都是 Function 類型的實例,而且都與其他引用類型一樣具有屬性和方法

2.由于函數(shù)名僅僅是指向函數(shù)的指針,因此函數(shù)名與包含對象指針的其他變量沒有什么不同

function sum(num1, num2){
    return num1 + num2;
}
alert(sum(10,10)); //20
var anotherSum = sum;
alert(anotherSum(10,10)); //20
sum = null;
alert(anotherSum(10,10)); //20

3.ECMAScript中函數(shù)沒有重載

4.函數(shù)聲明和函數(shù)表達式的區(qū)別:解析器會率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用(可以訪問);至于函數(shù)表達式,則必須等到解析器執(zhí)行到它所在的代碼行,才會真正被解釋執(zhí)行

alert(sum(10,10));
function sum(num1, num2){
    return num1 + num2;
}                              //函數(shù)聲明提升,正常執(zhí)行

alert(sum(10,10));
var sum = function(num1, num2){
    return num1 + num2;
};                            //報錯

5.作為值得函數(shù):不僅可以像傳遞參數(shù)一樣把一個函數(shù)傳遞給另一個函數(shù),而且可以將一個函數(shù)作為另一個函數(shù)的結果返回;僅使用函數(shù)名可以訪問函數(shù)的指針而不執(zhí)行函數(shù)。

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

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

arguments它是一個類數(shù)組對象,包含著傳入函數(shù)中的所有參數(shù),它還包含一個屬性交callee,該屬性是一個指針,指向擁有這個 arguments 對象的函數(shù)。callee屬性可以用來解耦合。

function factorial(num){
if (num <=1) {
    return 1;
} else {
    return num * factorial(num-1)        //利用factorial函數(shù)名回調遞歸
    }
}

這樣做法如果之后factorial賦值給別的變量,然后又重新賦值一個函數(shù)給factorial。那么別的變量并不會調用到原本的遞歸函數(shù),而是調用到factorial新賦值的函數(shù)。所以需要消除這種緊耦合。

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)); //120
alert(factorial(5)); //0

7.函數(shù)內(nèi)部屬性this
this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象——或者也可以說是 this 值

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

ps:函數(shù)的名字僅僅是一個包含指針的變量而已。因此,即使是在不同的環(huán)境中執(zhí)行,全局的sayColor()函數(shù)與o.sayColor()函數(shù)指向的仍然是同一個函數(shù)。

8.函數(shù)都包含的屬性與length和protoType。
length是函數(shù)接收的命名參數(shù)個數(shù);
protoType是保存他們所有實例方法的真正所在,例如valueOf(),toString(),只不過是通過各自對象的實例訪問。另外,prototype 屬性是不可枚舉的,因此使用 for-in 無法發(fā)現(xiàn)。

9.每個函數(shù)都包含兩個非繼承而來的方法:apply()和 call()。這兩個方法的用途都是在特定的作用域中調用函數(shù)
apply()方法接收兩個參數(shù):一個是在其中運行函數(shù)的作用域,另一個是參數(shù)數(shù)組

function sum(num1, num2){
    return num1 + num2;
}
function callSum1(num1, num2){
    return sum.apply(this, arguments); // 傳入 arguments 對象
}
function callSum2(num1, num2){
    return sum.apply(this, [num1, num2]); // 傳入數(shù)組
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20

call()方法與 apply()方法的作用相同,它們的區(qū)別僅在于接收參數(shù)的方式不同。傳遞給函數(shù)的參數(shù)必須逐個列舉出來。

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

10.傳遞參數(shù)并非 apply()和 call()真正的用武之地;它們真正強大的地方是能夠擴充函數(shù)賴以運行的作用域

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

使用 call()(或 apply())來擴充作用域的最大好處,就是對象不需要與方法有任何耦合關系。

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

轉載請注明本文地址:http://systransis.cn/yun/105247.html

相關文章

  • Effective JavaScript讀書筆記(一)

    摘要:如果為假值,不傳或者傳入,函數(shù)都會返回但是,傳入這個值是完全有可能的,所以這種判斷形勢是不正確的或者使用來判斷也可以原始類型優(yōu)于封裝類型對象擁有六個原始值基本類型布爾值,數(shù)字,字符串,,和對象。 作為一個前端新人,多讀書讀好書,夯實基礎是十分重要的,正如蓋樓房一樣,底層穩(wěn)固了,才能越壘越高。從開始學習到現(xiàn)在,基礎的讀了紅寶書《JavaScript高級程序設計》,犀牛書《JavaScri...

    zhoutao 評論0 收藏0
  • JavaScript寶書筆記(四)---變量、作用域和內(nèi)存問題

    摘要:在操作對象時,實際上是在操作對象的引用而不是實際的對象。為此,引用類型的值是按引用訪問的。標記清除是目前主流的垃圾收集算法,這種算法的思想是給當前不使用的值加上標記,然后再回收其內(nèi)存 1.在操作對象時,實際上是在操作對象的引用而不是實際的對象。為此,引用類型的值是按引用訪問的。 2.當從一個變量向另一個變量復制引用類型的值時,兩個變量實際上將引用同一個對象,因此,改變其中一個變量,就會...

    imtianx 評論0 收藏0
  • JavaScript寶書筆記(一)---JS概述、變量及基本數(shù)據(jù)類型

    摘要:是一個數(shù)值可以被轉換成數(shù)值不能轉換成數(shù)值可以被轉換成數(shù)值十六進制數(shù)八進制數(shù)十進制數(shù)十六進制數(shù)可以避免,無法使用方法轉換成字符串的情況 1.JavaScript由三個部分組成:ECMAScript(提供核心語言功能)、DOM(文檔對象模型,提供訪問和操作網(wǎng)頁內(nèi)容的方法和接口)、BOM(瀏覽器對象模型,提供與瀏覽器交互的方法和接口) 2.JavaScript概念:是一種專為與網(wǎng)頁交互而設計...

    sevi_stuo 評論0 收藏0
  • JavaScript寶書筆記(五)---引用類型

    摘要:在通過對象字面量定義對象時,實際上不會調用構造函數(shù)相當于因為是松散類型數(shù)據(jù),所以類型也擁有著同樣的特性。數(shù)組的每一項可以保存任何類型的數(shù)據(jù),且數(shù)組的大小是可以動態(tài)調整的。對數(shù)組中的每一項運行給定函數(shù),返回該函數(shù)會返回的項組成的數(shù)組。 1.在通過對象字面量定義對象時,實際上不會調用 Object 構造函數(shù) var person = { name : Nicholas, a...

    G9YH 評論0 收藏0
  • JavaScript寶書筆記(六)---RegExp類型

    摘要:第二個循環(huán)使用構造函數(shù)在每次循環(huán)中創(chuàng)建正則表達式。布爾值,表示是否設置了標志。整數(shù),表示開始搜索下一個匹配項的字符位置,從算起。正則表達式的字符串表示,按照字面量形式而非傳入構造函數(shù)中的字符串模式返回。 1.var someDate = new Date(Date.parse(May 25, 2004));可用來計算時間差 //取得開始時間 var start = Date.now()...

    eternalshallow 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<