1.函數對象和函數指標
函數實際上是一個可執行檔對象,任何訪問函數對象的方式都是函數指標。
不論 使用哪一種方式
var a=new Function(...);
function a(...){...}
var a=function(...){...}
得到的函數名a都是一個指向函數的指標 可以用var b=a;來建立另外一個指向它的指標。
但是 它們指向同一段函數。因為函數名是一個指標,所以能夠被作為參數傳遞。
()運算子作用於一個函數指標將會執行它所在的函數,當然還會傳入參數。
2.函數直接量(函數文字量)
實際上函數直接量這個說法並不準確 但可以通俗地解釋一些用法
125 "good"是都是直接量 可以在代碼中不通過變數名使用 函數也有類似的用法
function(){...} 代表了一個函數指標的值 它指向function(){...}定義的函數
那麼 (function(){...})() 就執行了這個函數 a=function(){...}就建立了這個指標的一個副本
3.函數對象的成員
函數對象繼承自object對象 它還有自己的屬性和方法
查到的就這麼多 來自vs2005的提示
f.apply(thisValue,argArray);//在thisValue對象上執行 參數由數組argArray提供
f.call(thisValue);//在thisValue對象上執行,不是沒有參數,要用參數的話直接跟在thisValue後面
f.prototype; //原型 很常見 前面也用過 不多說了。
f.length;//參數列表的長度
f.hasOwnProperty(propertyName);//繼承自Object的方法,檢查對象是否有指定屬性
f.propertyIsEnumerable(propertyName);//繼承自Object的方法,檢查指定屬性是否能被for in枚舉出來 (除了firefox下的prototype 其他屬性都不能被枚舉)
f.toLocaleString();//繼承自Object的方法,轉換為字串
f.toString();//繼承自Object的方法,轉換為字串 在alert document.write等時自動調用
f.valueOf();//繼承自Object的方法,求值,對象做算術運算時自動調用,如果預設就是toString
3.javascript函數能訪問的範圍
javascript函數究竟能訪問那些資源? 包括三部分:函數的範圍、this指標、參數除此之外函數無法訪問任何資源。
如果要比較清晰地理解函數 應當想像函數有三組參數:
第一組是範圍 在定義時確定 是函數定義位置決定的 暫稱為外範圍 在函數定義處可以訪問的變數和函數在函數中也可以訪問,不論調用這個函數的指標被傳遞到哪裡
第二組是this 在函數被調用時確定
如果函數是用()調用的 它預設指向函數所屬的對象:如果函數是某個對象的成員 那麼this指向這個對象,否則指向全域對象(大多數時候是window)
如果函數是用apply或者call調用的 this指向指定的thisvalue
第三組是參數 在函數被調用時確定 在參數列表中的參數可以直接存取 不再參數列表中的參數可以用arguments訪問
4.函數範圍的產生與訪問
函數除了能夠訪問一個範圍之外 每次執行 會產生一個新的範圍 (閉包)
此範圍之外的代碼無法訪問這一範圍的變數 此範圍內的代碼可以訪問這個範圍以及此函數定義時的範圍。
跨範圍的訪問只能通過指標。js中object是指標類型。
想要獲得指向某個範圍的指標 必須從這個範圍中把指標傳遞出來:即把此範圍中的指標類型變數的值賦給其他範圍的變數
前面所說一個函數中能夠訪問的資源套件括 this 外範圍 參數 所以可以通過這種方式訪問其他範圍中的變數。
一個很bt的例子
<script> //想辦法訪問一個很深的嵌套中的函數對象 var o=new Object(); function a(obj){ var pointer; (function(){ var p=new function(){ function f(){ var x=function(){alert("Try to visit me!")};//x是一個指標 return x;//作為傳回值傳遞出第一層; } this.x=f();//用this傳遞出第二層; } pointer=p.x;//用外範圍傳遞出第三層 })() obj.x=pointer;//用參數傳遞出第四層 } a(o); o.x(); </script>
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
最後這個例子太BT了,實際上,雖然js的function有這樣的能力,但是在使用時我們一般會有一個限制,就是閉包中訪問閉包外變數時,不應當採用有“副作用”的運算式,例如++、--或者賦值,也就是說限制閉包訪問外部域的內容僅限於“讀”和“運算式計算”,可以修改外部變數實際引用的對象的值,但是不要在閉包內修改外部變數本身的值。所以下面的例子
function c(a){
return function(x)
{
return x+a++;
}
}
通常是合法但不合理的,因為這是一個有副作用的閉包。在程式邏輯複雜的情況下這很容易導致混亂。因為這個閉包在什麼時候調用是完全不確定的。這個閉包的存在使得這個函數每次調用的傳回值完全不同,即使採用的是同一個參數。這顯然違背了functional“公式化”的基本原則。
不過,實際上上面這種函數倒有一個特殊用途,用來產生某些特殊的計數器 :)
所以限制也不是絕對的...