摘要:函數實際上是對象。所以需要消除這種緊耦合。函數內部屬性引用的是函數據以執行的環境對象或者也可以說是值函數的名字僅僅是一個包含指針的變量而已。因此,即使是在不同的環境中執行,全局的函數與函數指向的仍然是同一個函數。
1.函數實際上是對象。每個函數都是 Function 類型的實例,而且都與其他引用類型一樣具有屬性和方法
2.由于函數名僅僅是指向函數的指針,因此函數名與包含對象指針的其他變量沒有什么不同
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中函數沒有重載
4.函數聲明和函數表達式的區別:解析器會率先讀取函數聲明,并使其在執行任何代碼之前可用(可以訪問);至于函數表達式,則必須等到解析器執行到它所在的代碼行,才會真正被解釋執行
alert(sum(10,10)); function sum(num1, num2){ return num1 + num2; } //函數聲明提升,正常執行 alert(sum(10,10)); var sum = function(num1, num2){ return num1 + num2; }; //報錯
5.作為值得函數:不僅可以像傳遞參數一樣把一個函數傳遞給另一個函數,而且可以將一個函數作為另一個函數的結果返回;僅使用函數名可以訪問函數的指針而不執行函數。
function add10(num){ return num + 10; } var result1 = callSomeFunction(add10, 10); alert(result1); //20
6.函數內部屬性arguments
arguments它是一個類數組對象,包含著傳入函數中的所有參數,它還包含一個屬性交callee,該屬性是一個指針,指向擁有這個 arguments 對象的函數。callee屬性可以用來解耦合。
function factorial(num){ if (num <=1) { return 1; } else { return num * factorial(num-1) //利用factorial函數名回調遞歸 } }
這樣做法如果之后factorial賦值給別的變量,然后又重新賦值一個函數給factorial。那么別的變量并不會調用到原本的遞歸函數,而是調用到factorial新賦值的函數。所以需要消除這種緊耦合。
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.函數內部屬性this
this引用的是函數據以執行的環境對象——或者也可以說是 this 值
window.color = "red"; var o = { color: "blue" }; function sayColor(){ alert(this.color); } sayColor(); //"red" o.sayColor = sayColor; o.sayColor(); //"blue"
ps:函數的名字僅僅是一個包含指針的變量而已。因此,即使是在不同的環境中執行,全局的sayColor()函數與o.sayColor()函數指向的仍然是同一個函數。
8.函數都包含的屬性與length和protoType。
length是函數接收的命名參數個數;
protoType是保存他們所有實例方法的真正所在,例如valueOf(),toString(),只不過是通過各自對象的實例訪問。另外,prototype 屬性是不可枚舉的,因此使用 for-in 無法發現。
9.每個函數都包含兩個非繼承而來的方法:apply()和 call()。這兩個方法的用途都是在特定的作用域中調用函數
apply()方法接收兩個參數:一個是在其中運行函數的作用域,另一個是參數數組
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]); // 傳入數組 } alert(callSum1(10,10)); //20 alert(callSum2(10,10)); //20
call()方法與 apply()方法的作用相同,它們的區別僅在于接收參數的方式不同。傳遞給函數的參數必須逐個列舉出來。
function sum(num1, num2){ return num1 + num2; } function callSum(num1, num2){ return sum.call(this, num1, num2); } alert(callSum(10,10)); //20
10.傳遞參數并非 apply()和 call()真正的用武之地;它們真正強大的地方是能夠擴充函數賴以運行的作用域
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())來擴充作用域的最大好處,就是對象不需要與方法有任何耦合關系。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105247.html
摘要:如果為假值,不傳或者傳入,函數都會返回但是,傳入這個值是完全有可能的,所以這種判斷形勢是不正確的或者使用來判斷也可以原始類型優于封裝類型對象擁有六個原始值基本類型布爾值,數字,字符串,,和對象。 作為一個前端新人,多讀書讀好書,夯實基礎是十分重要的,正如蓋樓房一樣,底層穩固了,才能越壘越高。從開始學習到現在,基礎的讀了紅寶書《JavaScript高級程序設計》,犀牛書《JavaScri...
摘要:在操作對象時,實際上是在操作對象的引用而不是實際的對象。為此,引用類型的值是按引用訪問的。標記清除是目前主流的垃圾收集算法,這種算法的思想是給當前不使用的值加上標記,然后再回收其內存 1.在操作對象時,實際上是在操作對象的引用而不是實際的對象。為此,引用類型的值是按引用訪問的。 2.當從一個變量向另一個變量復制引用類型的值時,兩個變量實際上將引用同一個對象,因此,改變其中一個變量,就會...
摘要:是一個數值可以被轉換成數值不能轉換成數值可以被轉換成數值十六進制數八進制數十進制數十六進制數可以避免,無法使用方法轉換成字符串的情況 1.JavaScript由三個部分組成:ECMAScript(提供核心語言功能)、DOM(文檔對象模型,提供訪問和操作網頁內容的方法和接口)、BOM(瀏覽器對象模型,提供與瀏覽器交互的方法和接口) 2.JavaScript概念:是一種專為與網頁交互而設計...
摘要:在通過對象字面量定義對象時,實際上不會調用構造函數相當于因為是松散類型數據,所以類型也擁有著同樣的特性。數組的每一項可以保存任何類型的數據,且數組的大小是可以動態調整的。對數組中的每一項運行給定函數,返回該函數會返回的項組成的數組。 1.在通過對象字面量定義對象時,實際上不會調用 Object 構造函數 var person = { name : Nicholas, a...
摘要:第二個循環使用構造函數在每次循環中創建正則表達式。布爾值,表示是否設置了標志。整數,表示開始搜索下一個匹配項的字符位置,從算起。正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回。 1.var someDate = new Date(Date.parse(May 25, 2004));可用來計算時間差 //取得開始時間 var start = Date.now()...
閱讀 3454·2021-11-22 12:00
閱讀 671·2019-08-29 13:24
閱讀 2905·2019-08-29 11:31
閱讀 2586·2019-08-26 14:00
閱讀 3185·2019-08-26 11:42
閱讀 2476·2019-08-23 18:31
閱讀 798·2019-08-23 18:27
閱讀 2844·2019-08-23 16:58