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