摘要:函數(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
摘要:如果為假值,不傳或者傳入,函數(shù)都會返回但是,傳入這個值是完全有可能的,所以這種判斷形勢是不正確的或者使用來判斷也可以原始類型優(yōu)于封裝類型對象擁有六個原始值基本類型布爾值,數(shù)字,字符串,,和對象。 作為一個前端新人,多讀書讀好書,夯實基礎是十分重要的,正如蓋樓房一樣,底層穩(wěn)固了,才能越壘越高。從開始學習到現(xiàn)在,基礎的讀了紅寶書《JavaScript高級程序設計》,犀牛書《JavaScri...
摘要:在操作對象時,實際上是在操作對象的引用而不是實際的對象。為此,引用類型的值是按引用訪問的。標記清除是目前主流的垃圾收集算法,這種算法的思想是給當前不使用的值加上標記,然后再回收其內(nèi)存 1.在操作對象時,實際上是在操作對象的引用而不是實際的對象。為此,引用類型的值是按引用訪問的。 2.當從一個變量向另一個變量復制引用類型的值時,兩個變量實際上將引用同一個對象,因此,改變其中一個變量,就會...
摘要:是一個數(shù)值可以被轉換成數(shù)值不能轉換成數(shù)值可以被轉換成數(shù)值十六進制數(shù)八進制數(shù)十進制數(shù)十六進制數(shù)可以避免,無法使用方法轉換成字符串的情況 1.JavaScript由三個部分組成:ECMAScript(提供核心語言功能)、DOM(文檔對象模型,提供訪問和操作網(wǎng)頁內(nèi)容的方法和接口)、BOM(瀏覽器對象模型,提供與瀏覽器交互的方法和接口) 2.JavaScript概念:是一種專為與網(wǎng)頁交互而設計...
摘要:在通過對象字面量定義對象時,實際上不會調用構造函數(shù)相當于因為是松散類型數(shù)據(jù),所以類型也擁有著同樣的特性。數(shù)組的每一項可以保存任何類型的數(shù)據(jù),且數(shù)組的大小是可以動態(tài)調整的。對數(shù)組中的每一項運行給定函數(shù),返回該函數(shù)會返回的項組成的數(shù)組。 1.在通過對象字面量定義對象時,實際上不會調用 Object 構造函數(shù) var person = { name : Nicholas, a...
摘要:第二個循環(huán)使用構造函數(shù)在每次循環(huán)中創(chuàng)建正則表達式。布爾值,表示是否設置了標志。整數(shù),表示開始搜索下一個匹配項的字符位置,從算起。正則表達式的字符串表示,按照字面量形式而非傳入構造函數(shù)中的字符串模式返回。 1.var someDate = new Date(Date.parse(May 25, 2004));可用來計算時間差 //取得開始時間 var start = Date.now()...
閱讀 3462·2021-11-22 12:00
閱讀 681·2019-08-29 13:24
閱讀 2913·2019-08-29 11:31
閱讀 2602·2019-08-26 14:00
閱讀 3205·2019-08-26 11:42
閱讀 2483·2019-08-23 18:31
閱讀 808·2019-08-23 18:27
閱讀 2856·2019-08-23 16:58