国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

關于javascript函數的幾個話題

2019-11-21 02:12:22
字體:
來源:轉載
供稿:網友
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的例子

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執行]

最后這個例子太BT了,實際上,雖然js的function有這樣的能力,但是在使用時我們一般會有一個限制,就是閉包中訪問閉包外變量時,不應當采用有“副作用”的表達式,例如++、--或者賦值,也就是說限制閉包訪問外部域的內容僅限于“讀”和“表達式計算”,可以修改外部變量實際引用的對象的值,但是不要在閉包內修改外部變量本身的值。所以下面的例子
function c(a){
    return function(x)
    {
        return x+a++;
    }
}
通常是合法但不合理的,因為這是一個有副作用的閉包。在程序邏輯復雜的情況下這很容易導致混亂。因為這個閉包在什么時候調用是完全不確定的。這個閉包的存在使得這個函數每次調用的返回值完全不同,即使采用的是同一個參數。這顯然違背了functional“公式化”的基本原則。

不過,實際上上面這種函數倒有一個特殊用途,用來生成某些特殊的計數器 :)
所以限制也不是絕對的...
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南昌市| 东至县| 泗阳县| 社旗县| 社会| 霞浦县| 永德县| 昂仁县| 武冈市| 洛隆县| 华亭县| 琼中| 太保市| 阜城县| 新宾| 浮山县| 疏勒县| 万盛区| 泰和县| 屏东县| 海城市| 子长县| 杨浦区| 青川县| 仙居县| 巴里| 南陵县| 名山县| 保亭| 绵阳市| 黔江区| 宁远县| 瑞丽市| 平罗县| 山阴县| 当雄县| 塔城市| 临西县| 石景山区| 元阳县| 临夏县|