關(guān)于javascript函數(shù)的幾個(gè)話題
更新時(shí)間:2007年03月14日 00:00:00 作者:
1.函數(shù)對象和函數(shù)指針
函數(shù)實(shí)際上是一個(gè)可執(zhí)行的對象,任何訪問函數(shù)對象的方式都是函數(shù)指針。
不論 使用哪一種方式
var a=new Function(...);
function a(...){...}
var a=function(...){...}
得到的函數(shù)名a都是一個(gè)指向函數(shù)的指針 可以用var b=a;來創(chuàng)建另外一個(gè)指向它的指針。
但是 它們指向同一段函數(shù)。因?yàn)楹瘮?shù)名是一個(gè)指針,所以能夠被作為參數(shù)傳遞。
()運(yùn)算符作用于一個(gè)函數(shù)指針將會(huì)執(zhí)行它所在的函數(shù),當(dāng)然還會(huì)傳入?yún)?shù)。
2.函數(shù)直接量(函數(shù)文字量)
實(shí)際上函數(shù)直接量這個(gè)說法并不準(zhǔn)確 但可以通俗地解釋一些用法
125 "good"是都是直接量 可以在代碼中不通過變量名使用 函數(shù)也有類似的用法
function(){...} 代表了一個(gè)函數(shù)指針的值 它指向function(){...}定義的函數(shù)
那么 (function(){...})() 就執(zhí)行了這個(gè)函數(shù) a=function(){...}就創(chuàng)建了這個(gè)指針的一個(gè)副本
3.函數(shù)對象的成員
函數(shù)對象繼承自object對象 它還有自己的屬性和方法
查到的就這么多 來自vs2005的提示
f.apply(thisValue,argArray);//在thisValue對象上執(zhí)行 參數(shù)由數(shù)組argArray提供
f.call(thisValue);//在thisValue對象上執(zhí)行,不是沒有參數(shù),要用參數(shù)的話直接跟在thisValue后面
f.prototype; //原型 很常見 前面也用過 不多說了。
f.length;//參數(shù)列表的長度
f.hasOwnProperty(propertyName);//繼承自O(shè)bject的方法,檢查對象是否有指定屬性
f.propertyIsEnumerable(propertyName);//繼承自O(shè)bject的方法,檢查指定屬性是否能被for in枚舉出來 (除了firefox下的prototype 其他屬性都不能被枚舉)
f.toLocaleString();//繼承自O(shè)bject的方法,轉(zhuǎn)換為字符串
f.toString();//繼承自O(shè)bject的方法,轉(zhuǎn)換為字符串 在alert document.write等時(shí)自動(dòng)調(diào)用
f.valueOf();//繼承自O(shè)bject的方法,求值,對象做算術(shù)運(yùn)算時(shí)自動(dòng)調(diào)用,如果默認(rèn)就是toString
3.javascript函數(shù)能訪問的范圍
javascript函數(shù)究竟能訪問那些資源? 包括三部分:函數(shù)的作用域、this指針、參數(shù)除此之外函數(shù)無法訪問任何資源。
如果要比較清晰地理解函數(shù) 應(yīng)當(dāng)想像函數(shù)有三組參數(shù):
第一組是作用域 在定義時(shí)確定 是函數(shù)定義位置決定的 暫稱為外作用域 在函數(shù)定義處可以訪問的變量和函數(shù)在函數(shù)中也可以訪問,不論調(diào)用這個(gè)函數(shù)的指針被傳遞到哪里
第二組是this 在函數(shù)被調(diào)用時(shí)確定
如果函數(shù)是用()調(diào)用的 它默認(rèn)指向函數(shù)所屬的對象:如果函數(shù)是某個(gè)對象的成員 那么this指向這個(gè)對象,否則指向全局對象(大多數(shù)時(shí)候是window)
如果函數(shù)是用apply或者call調(diào)用的 this指向指定的thisvalue
第三組是參數(shù) 在函數(shù)被調(diào)用時(shí)確定 在參數(shù)列表中的參數(shù)可以直接訪問 不再參數(shù)列表中的參數(shù)可以用arguments訪問
4.函數(shù)作用域的生成與訪問
函數(shù)除了能夠訪問一個(gè)作用域之外 每次執(zhí)行 會(huì)生成一個(gè)新的作用域 (閉包)
此作用域之外的代碼無法訪問這一作用域的變量 此作用域內(nèi)的代碼可以訪問這個(gè)作用域以及此函數(shù)定義時(shí)的作用域。
跨作用域的訪問只能通過指針。js中object是指針類型。
想要獲得指向某個(gè)作用域的指針 必須從這個(gè)作用域中把指針傳遞出來:即把此作用域中的指針類型變量的值賦給其他作用域的變量
前面所說一個(gè)函數(shù)中能夠訪問的資源包括 this 外作用域 參數(shù) 所以可以通過這種方式訪問其他作用域中的變量。
一個(gè)很bt的例子
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
最后這個(gè)例子太BT了,實(shí)際上,雖然js的function有這樣的能力,但是在使用時(shí)我們一般會(huì)有一個(gè)限制,就是閉包中訪問閉包外變量時(shí),不應(yīng)當(dāng)采用有“副作用”的表達(dá)式,例如++、--或者賦值,也就是說限制閉包訪問外部域的內(nèi)容僅限于“讀”和“表達(dá)式計(jì)算”,可以修改外部變量實(shí)際引用的對象的值,但是不要在閉包內(nèi)修改外部變量本身的值。所以下面的例子
function c(a){
return function(x)
{
return x+a++;
}
}
通常是合法但不合理的,因?yàn)檫@是一個(gè)有副作用的閉包。在程序邏輯復(fù)雜的情況下這很容易導(dǎo)致混亂。因?yàn)檫@個(gè)閉包在什么時(shí)候調(diào)用是完全不確定的。這個(gè)閉包的存在使得這個(gè)函數(shù)每次調(diào)用的返回值完全不同,即使采用的是同一個(gè)參數(shù)。這顯然違背了functional“公式化”的基本原則。
不過,實(shí)際上上面這種函數(shù)倒有一個(gè)特殊用途,用來生成某些特殊的計(jì)數(shù)器 :)
所以限制也不是絕對的...
函數(shù)實(shí)際上是一個(gè)可執(zhí)行的對象,任何訪問函數(shù)對象的方式都是函數(shù)指針。
不論 使用哪一種方式
var a=new Function(...);
function a(...){...}
var a=function(...){...}
得到的函數(shù)名a都是一個(gè)指向函數(shù)的指針 可以用var b=a;來創(chuàng)建另外一個(gè)指向它的指針。
但是 它們指向同一段函數(shù)。因?yàn)楹瘮?shù)名是一個(gè)指針,所以能夠被作為參數(shù)傳遞。
()運(yùn)算符作用于一個(gè)函數(shù)指針將會(huì)執(zhí)行它所在的函數(shù),當(dāng)然還會(huì)傳入?yún)?shù)。
2.函數(shù)直接量(函數(shù)文字量)
實(shí)際上函數(shù)直接量這個(gè)說法并不準(zhǔn)確 但可以通俗地解釋一些用法
125 "good"是都是直接量 可以在代碼中不通過變量名使用 函數(shù)也有類似的用法
function(){...} 代表了一個(gè)函數(shù)指針的值 它指向function(){...}定義的函數(shù)
那么 (function(){...})() 就執(zhí)行了這個(gè)函數(shù) a=function(){...}就創(chuàng)建了這個(gè)指針的一個(gè)副本
3.函數(shù)對象的成員
函數(shù)對象繼承自object對象 它還有自己的屬性和方法
查到的就這么多 來自vs2005的提示
f.apply(thisValue,argArray);//在thisValue對象上執(zhí)行 參數(shù)由數(shù)組argArray提供
f.call(thisValue);//在thisValue對象上執(zhí)行,不是沒有參數(shù),要用參數(shù)的話直接跟在thisValue后面
f.prototype; //原型 很常見 前面也用過 不多說了。
f.length;//參數(shù)列表的長度
f.hasOwnProperty(propertyName);//繼承自O(shè)bject的方法,檢查對象是否有指定屬性
f.propertyIsEnumerable(propertyName);//繼承自O(shè)bject的方法,檢查指定屬性是否能被for in枚舉出來 (除了firefox下的prototype 其他屬性都不能被枚舉)
f.toLocaleString();//繼承自O(shè)bject的方法,轉(zhuǎn)換為字符串
f.toString();//繼承自O(shè)bject的方法,轉(zhuǎn)換為字符串 在alert document.write等時(shí)自動(dòng)調(diào)用
f.valueOf();//繼承自O(shè)bject的方法,求值,對象做算術(shù)運(yùn)算時(shí)自動(dòng)調(diào)用,如果默認(rèn)就是toString
3.javascript函數(shù)能訪問的范圍
javascript函數(shù)究竟能訪問那些資源? 包括三部分:函數(shù)的作用域、this指針、參數(shù)除此之外函數(shù)無法訪問任何資源。
如果要比較清晰地理解函數(shù) 應(yīng)當(dāng)想像函數(shù)有三組參數(shù):
第一組是作用域 在定義時(shí)確定 是函數(shù)定義位置決定的 暫稱為外作用域 在函數(shù)定義處可以訪問的變量和函數(shù)在函數(shù)中也可以訪問,不論調(diào)用這個(gè)函數(shù)的指針被傳遞到哪里
第二組是this 在函數(shù)被調(diào)用時(shí)確定
如果函數(shù)是用()調(diào)用的 它默認(rèn)指向函數(shù)所屬的對象:如果函數(shù)是某個(gè)對象的成員 那么this指向這個(gè)對象,否則指向全局對象(大多數(shù)時(shí)候是window)
如果函數(shù)是用apply或者call調(diào)用的 this指向指定的thisvalue
第三組是參數(shù) 在函數(shù)被調(diào)用時(shí)確定 在參數(shù)列表中的參數(shù)可以直接訪問 不再參數(shù)列表中的參數(shù)可以用arguments訪問
4.函數(shù)作用域的生成與訪問
函數(shù)除了能夠訪問一個(gè)作用域之外 每次執(zhí)行 會(huì)生成一個(gè)新的作用域 (閉包)
此作用域之外的代碼無法訪問這一作用域的變量 此作用域內(nèi)的代碼可以訪問這個(gè)作用域以及此函數(shù)定義時(shí)的作用域。
跨作用域的訪問只能通過指針。js中object是指針類型。
想要獲得指向某個(gè)作用域的指針 必須從這個(gè)作用域中把指針傳遞出來:即把此作用域中的指針類型變量的值賦給其他作用域的變量
前面所說一個(gè)函數(shù)中能夠訪問的資源包括 this 外作用域 參數(shù) 所以可以通過這種方式訪問其他作用域中的變量。
一個(gè)很bt的例子
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
最后這個(gè)例子太BT了,實(shí)際上,雖然js的function有這樣的能力,但是在使用時(shí)我們一般會(huì)有一個(gè)限制,就是閉包中訪問閉包外變量時(shí),不應(yīng)當(dāng)采用有“副作用”的表達(dá)式,例如++、--或者賦值,也就是說限制閉包訪問外部域的內(nèi)容僅限于“讀”和“表達(dá)式計(jì)算”,可以修改外部變量實(shí)際引用的對象的值,但是不要在閉包內(nèi)修改外部變量本身的值。所以下面的例子
function c(a){
return function(x)
{
return x+a++;
}
}
通常是合法但不合理的,因?yàn)檫@是一個(gè)有副作用的閉包。在程序邏輯復(fù)雜的情況下這很容易導(dǎo)致混亂。因?yàn)檫@個(gè)閉包在什么時(shí)候調(diào)用是完全不確定的。這個(gè)閉包的存在使得這個(gè)函數(shù)每次調(diào)用的返回值完全不同,即使采用的是同一個(gè)參數(shù)。這顯然違背了functional“公式化”的基本原則。
不過,實(shí)際上上面這種函數(shù)倒有一個(gè)特殊用途,用來生成某些特殊的計(jì)數(shù)器 :)
所以限制也不是絕對的...
相關(guān)文章
js通過googleAIP翻譯PHP系統(tǒng)的語言配置的實(shí)現(xiàn)代碼
一同事弄了個(gè)系統(tǒng)是php寫的,雖然是多語言但沒中文!他打算手動(dòng)翻譯2000多個(gè)語言配置,真是佩服,知道后想了想,應(yīng)該有好的法辦2011-10-10
js獲取當(dāng)前日期時(shí)間及其它日期操作匯總
這篇文章主要介紹了js獲取當(dāng)前日期時(shí)間及其它日期操作匯總,感興趣的小伙伴們可以參考一下2016-03-03
微信小程序開發(fā)打開另一個(gè)小程序的實(shí)現(xiàn)方法
這篇文章主要介紹了微信小程序開發(fā)打開另一個(gè)小程序的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
js中base64、url和blob之間相互轉(zhuǎn)換的3種方式(詳細(xì)代碼)
這篇文章主要給大家介紹了關(guān)于js中base64、url和blob之間相互轉(zhuǎn)換的3種方式,Blob和File是用來表示二進(jìn)制數(shù)據(jù)的,而Base64則是一種編碼方式,用來把二進(jìn)制數(shù)據(jù)編碼成可讀的字符串,需要的朋友可以參考下2023-10-10
JS PHP字符串截取函數(shù)實(shí)現(xiàn)原理解析
這篇文章主要介紹了JS PHP字符串截取函數(shù)實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
原生js實(shí)現(xiàn)計(jì)算購物車總金額的示例
本文主要介紹了原生js實(shí)現(xiàn)計(jì)算購物車總金額的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
JavaScript實(shí)現(xiàn)對下拉列表值進(jìn)行排序的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)對下拉列表值進(jìn)行排序的方法,實(shí)例分析了javascript對下拉列表元素的遍歷與排序?qū)崿F(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
js數(shù)組常用操作方法小結(jié)(增加,刪除,合并,分割等)
這篇文章主要介紹了js數(shù)組常用操作方法,結(jié)合實(shí)例總結(jié)了javascript數(shù)組的增加、刪除、合并、分割等操作技巧,需要的朋友可以參考下2016-08-08

