1. 程式人生 > >《javascript高階程式設計》——引用型別之Function

《javascript高階程式設計》——引用型別之Function

1.函式實際上是物件,函式名實際上是一個指向函式物件的指標。

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

因此沒有過載,同名函式,後者會覆蓋前者。

2.函式宣告和函式表示式

//正常執行
alert(sum(10,10));
function sum(num1,num2){
    return num1+num2;
}

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

3.作為值的函式

可以從一個函式中返回另一個函式,例如下面這個例子:

function compare(propertyName){
    return function(obj1,obj2){
        var value1=obj1[propertyName];
        var value2=obj2[propertyName];
        return value2-value1;
    };
}

4.函式內部屬性

函式內部有兩個特殊的物件:arguments和this。arguments包含著傳入函式的所有引數,它有一個callee的屬性,這是一個指標,指向擁有該arguments物件的函式。

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

上述是個典型的求階乘函式,在其函式內部用到了函式名,這會增加執行與名字的耦合度,因此可以像下面這樣:

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

var anotherFac=fac;
alert(anotherFac(5
));//120 fac=function(){ return 0; } alert(anotherFac(5));//120


this引用的是函資料以執行的環境物件。

window.color="red";

function sayColor(){
    alert(this.color);
}

var o={
    color:"blue"
}

sayColor();//red

o.sayColor=sayColor;
o.sayColor();//blue

還有一個屬性:caller。它儲存著呼叫當前函式的函式的引用。

嚴格模式下不能用arguments.callee和arguments.caller。

5.函式方法

有兩個方法:call()和apply()。用途都是在特定的作用域中執行函式。apply接受兩個引數:一個是執行函式的作用域,另一個是引數陣列。

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

call()的區別在於其引數必須逐個列舉出來。

function sum4(num1,num2){
    return sum.apply(this,num1,num2);
}
alert(sum4(10,10));//20

上述兩個方法的強大之處在於其能夠擴大函式賴以執行的作用域。

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

sayColor();//red
sayColor.apply(this);//red
sayColor.apply(o);//blue     

顯然這樣擴充作用域的好處是,物件不需要與方法有任何耦合關係。

函式繼承的toString()和toLocaleString()以及valueOf()會返回函式的程式碼。

相關推薦

javascript高階程式設計》——引用型別Function

1.函式實際上是物件,函式名實際上是一個指向函式物件的指標。 function sum(num1,num2){ return num1+num2; } alert(sum(10,10));//20 var anotherSum=sum; aler

JavaScript高階程式設計學習筆記事件

1、事件流 事件流描述的是從頁面中接收事件的順序。 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件開始時由最具體的元素(文件中巢狀層次最深的那個節點)接收,然後逐級向上傳播到較為不具體的節點(文件)。(DOM樹向上傳播)(通俗解釋(個人理解: 當一個元素上的事件被觸發的時候,比如

JavaScript高階程式設計讀書筆記JSON

JSON(JavaScript Object Notation)JavaScript物件表示法。JSON是JavaScript的一個嚴格的子集,利用了JavaScript中的一些模式來表示結構化資料。關於JSON,最重要的是理解它是一種資料格式,不是一種程式語言。雖然具有相同的語法形式,但JSON並不從屬於J

Javascript高階程式設計--讀書筆記面向物件(一)

哈哈哈萬物皆物件,終於到了js的面向物件篇。 一、屬性型別 (1)資料屬性 資料屬性包含一個數據值的位置,在這個位置可以寫入和讀取數值,資料屬性有四個描述器行為的特性 [[Configurable]]:表示能否通過 delete 刪除屬性而重新定義屬性,預設值是ture [[Enumerab

Javascript高階程式設計學習筆記(16)—— 引用型別(5) Function型別

JS中許多有趣的地方都和函式脫不了聯絡 那麼是什麼讓JS中的函式這麼有趣呢?  我們一起來看看吧   Function型別 在JS中函式實際上就是物件,每個函式都是Function型別的例項,和JS的其他引用型別都擁有屬性和方法 正是由於這個原因,函式名實際上就是一個指標,指向

JavaScript高階程式設計》——JS基本概念資料型別

ECMAScript 中有五種簡單資料型別(基本資料型別):Undefined、Null、Boolean、Number 和 String。還有一種複雜資料模型:Object。 資料型別 1 typeof 操作符 typeof 用來檢測給定變數的資料型別。對一個值使用 typeof

JavaScript高階程式設計第三版學習筆記(一)資料型別區分詳談

  null、NaN、undefined三者的區別是什麼?   在初次接觸到JavaScript的時候,傻傻的分不清null、NaN、undefined三者到底區別何在,在實際的專案開發中也因為這個問題而困惑久矣。針對這個問題,我特意查找了多方資料,在筆記本上做了詳細的分析記錄,但是由於紙質資料不便於攜帶、

JavaScript高階程式設計(第3版)》 第三天 引用型別

/*====================================================== *@author wf_Huang *@Time 2018/9/18 20:06 *=======================================

Javascript 高階程式設計(第三版)》筆記0x7 引用型別(2)

目錄   Function 型別      沒有過載     函式宣告與函式表示式      作為值的函式       將一個函式作為另一個函

Javascript 高階程式設計(第三版)》筆記0x6 引用型別(1)

目錄  Object型別 Array 型別     檢測陣列     轉換方法         toString(),valueOf()       &

Javascript高階程式設計學習筆記(12)—— 引用型別(1)Object型別

前面的文章中我們知道JS中的值分為兩種型別 基礎型別的值和引用型別的值 基礎型別的值我已經大概介紹了一下,今天開始後面幾天我會為大家介紹一下引用型別的值   Object型別 物件是引用型別的值的例項,在ECMA中引用型別是一種資料結構 用於將資料和功能組織到一起,在其它程式語言中通常也

Javascript高階程式設計學習筆記(15)—— 引用型別(4)RegExp型別

JS中處理字串最常用的應該就是正則了 同樣正則(RegExp)型別也是JS中引用型別的一種 ECMAScript通過 RegExp型別 來支援正則表示式   建立正則 var expression = / pattern / flags; 在上面建立正則例項中 pattern

Javascript高階程式設計學習筆記(17)—— 引用型別(6)基本包裝類

基本包裝類 基本包裝類這個概念或許有的小夥伴沒有聽說過 但是小夥伴們有沒有想過,為什麼基本資料型別的例項也有方法呢? 其實這些方法都來自基本包裝型別 這是JS為了方便操作基礎資料型別而建立的特殊引用型別   基本包裝類有三種 1. Boolean型別 2. Number型別 3.

JavaScript高階程式設計(第三版)學習筆記(四)JavaScript引用型別

1、引用型別 引用型別是指封裝了變數和對應函式的結構體,它是例項就是物件,類似於C++、Java中的類,但沒有類的介面等。 建立方式一: var obj = new Object();//new關鍵字 + 建構函式 obj.name = "noodles"

[Javascript 高階程式設計]學習心得記錄7 引用型別(上)

    js引用型別的值(物件)是引用型別的例項,引用型別和類很像但是又不是同一個東西,引用型別被稱為対象定義,描述一類物件所具有的屬性和方法。     一,object型別     object型別是js基礎原生型別,建立該型別例項有兩種方法:new和物件字面量表示法。

JavaScript高階程式設計》第5章 引用型別

第5章引用型別在ECMAScript中,引用型別是一種資料結構,用於將資料和功能組織在一起。儘管ECMAScript從技術上講是一門面向物件的語言,但它不具備傳統的面嚮物件語言所支援的類和介面等基本結構

javascript高階程式設計---繼承

物件的繼承  1.繼承的思想:關鍵是將一個建構函式A的原型指向給另一個建構函式B的例項本身,那麼A例項將擁有(繼承)B例項的所有的屬性和方法(繼承在原型);   2.原理:將一個建構函式A的原型指向給另一個建構函式B的例項本身,也就意味著A原型將繼承B例項本身擁有的所

javascript高階程式設計--自執行函式

什麼是自執行函式? 顧名思義.就是不用呼叫,自己自動就會執行的函式; 為什麼要用自執行函式? 自執行函式內部是一個獨立的作用域,這樣就保持了一個相對獨立的名稱空間,避免汙染全域性作用域 怎麼建立自執行函式? 寫法一:(function(param){…})(re—param)

JavaScript高階程式設計客戶端檢測

瀏覽器檢測,是個很讓人頭痛但又必須要考慮的一個問題。畢竟市面上的瀏覽器廠商眾多,雖然有些標準化的東西約束著他們,但是有些東西,他們還是各自按自己的意願來。這其中以IE瀏覽器最為突出,它幾乎可以被稱之為萬惡之源。 瀏覽器檢測的方法有很多,這裡介紹的可能並不是全部,但基本上都是比較常用的方法。下邊我就來詳細介紹

JavaScript高階程式設計事件

當用戶按下某個按鈕是,就會觸發對應事件,事件在執行註冊事件時,繫結的程式,實現一次成功的瀏覽器與JS之間的互動。其中事件基於設計模式中的觀察者模式原理實現,但又有些不同,事件它還擁有著一些屬於自己的特點。 事件流   事件冒泡是IE的產物,它的流向,是自下向上,從繫結事件的具體元素開始,一直流到具體元素的