ES5-4 函數基礎與種類、形實參及映射、變量類型

模塊編程原則:高內聚,低耦合(重復部分少),讓一個模塊有強的功能性、高的獨立性 → 單一責任制,用函數進行解耦合。

1. 函數命名規則

  1. 不能以數字開頭
  2. 可以以字母_$開頭
  3. 包含數字
  4. 小駝峰命名法
  • 函數聲明一定有函數名,不然報錯
// Uncaught SyntaxError: Function statements require a function name
function () {console.log(1)
}
// 函數內 a是局部變量,b var在window上/GO,是全局變量(泄漏)
var a = b = 1 
  • 用表達式、字面量的形式聲明函數,test1是會被忽略的。外部不可見,內部可遞歸
// 用表達式、字面量的形式聲明函數,test1是會被忽略的
// test1() 會報錯(外部不可見)
var test = function test1() {console.log(1)test1() // 函數內部可以調用,遞歸
}
// 匿名函數表達式/函數字面量
var test = function () {console.log(1)
}
// 實參少傳
function test(a, b, c) {console.log(a, b, c)// 不報錯,c是undefined// 預編譯時第一步就處理形參 var x = undefined
}
test(1, 2)
// 實參多傳
function test(a, b) {console.log(a, b)// 不報錯 1 2
}
test(1, 2, 3)
  • 函數內可獲取實參和形參的個數
// 函數內可獲取實參、形參
function test(a, b) {console.log(arguments)// 實參個數console.log(test.length)// 形參個數
}
  • 實參傳了值的,函數內實參可更改 打印出 3 2
  • 理解:實參和形參是映射關系,當形參改變,實參指向的堆空間的對應位置的值也改變了
    在這里插入圖片描述
  • 實參未傳值的,是無法賦值的,undefined

與其他程序設計語言不同,ECMAScript 不會驗證傳遞給函數的參數個數是否等于函數定義的參數個數。開發者定義的函數都可以接受任意個數的參數(根據 Netscape 的文檔,最多可接受 255 個),而不會引發任何錯誤。任何遺漏的參數都會以 undefined 傳遞給函數多余的函數將忽略

  • 用 arguments 對象判斷傳遞給函數的參數個數,即可模擬函數重載
// 一個函數,根據傳入實參個數的不同,做不同的事
function doAdd() {if(arguments.length == 1) {alert(arguments[0] + 5);} else if(arguments.length == 2) {alert(arguments[0] + arguments[1]);}
}doAdd(10);	//輸出 "15"
doAdd(40, 20);	//輸出 "60"
  • arguments[1]和形參b不是一個東西,一個存在堆內存、一個存在棧內存,但有映射關系(arguments存的是指針)
    在這里插入圖片描述
  • 函數內的return作用:終止和執行
  • 函數內不寫return,運行時會自動加上return
  • 遞歸實現階乘與斐波那契:找到規律和函數出口(函數return)
function compute(n) {if (n === 1) {return 1} else {return n * compute(n - 1)}
}
console.log('5的階乘', compute(5))
// value 1 1 2 3 5 8 13 21
// index 1 2 3 4 5 6  7 
function compute(n) {if (n === 0 || n === 1) {return 1} else {return compute(n - 1) + compute(n - 2)}}
console.log('斐波那契第7項', compute(7))

2. ECMAScript補充

  • ECMAScript 的函數實際上是功能完整的對象
  • 在下面的形式中,每個 arg 都是一個參數,最后一個參數是函數主體(要執行的代碼)。
  • 這些參數必須是字符串。
  • 由于字符串的關系,這種形式寫起來有些困難,但有助于理解函數只不過是一種引用類型,它們的行為與用 Function 類明確創建的函數行為是相同的。(但是typeof函數的返回值是function而不是object
  • 函數名只是指向函數對象的引用值,行為就像其他對象一樣。甚至可以使兩個變量指向同一個函數(理解函數重載)
  • 所有函數都應看作 Function 類的實例。
  • Function 對象也有與所有對象共享的 valueOf() 方法和 toString() 方法。這兩個方法返回的都是函數的源代碼 (原始值的基本包裝類、對象的toString方法)
var function_name = new Function(arg1, arg2, ..., argN, function_body)
function sayHi(sName, sMessage) {alert("Hello " + sName + sMessage);
}
var sayHi 
= 
new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251210.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javascript --- 抽象相等

字符串和數字之間的相等比較 var a 42; var b "42";a b; // false a b; // trueES5規范11.9.3.4-5定義如下: (1)如果Type(x)是數字,Type(y)是字符串,則返回 x ToNumber(y) 的結果 (2)如果Type(x)是字符串,Type(x)是數字,則返回 ToNumber(x) y 的結果// 總結…

Spring加載context的幾種方法

Spring中的context管理 Spring中IOC容器的初始化: ApplicationContext即是保存bean對象的容器,故容器本身的初始化,就是通過一系列的配置,將ApplicationContext進行初始化。 而配置ApplicationContext大方向上分為了3中&#xff1…

centos 6.5 配置網絡

編輯 vi /etc/sysconfig/network-scripts/ifcfg-eth0修改內容 DEVICE"eth0" BOOTPROTO"static" HWADDR"00:50:56:98:06:D0" IPV6INIT"no" MTU"1500" NM_CONTROLLED"no" ONBOOT"yes" TYPE…

ES5-5 參數默認值、遞歸、預編譯、暗示全局變量

1. 參數默認值 默認是undefined形參可以有默認值,形參、實參哪個有值取哪個ES6,默認值屬于ES6的內容,打印出的是符合人性化的結果形參有默認值,形參、實參無法統一、無論實參傳入有值還是undefined(代碼表現&#xff…

javascript --- 優先級執行順序

優先級網址 優先級: a && b || c ? c || b ? a : c && b :a// 從優先級網址可以看出 // &&的優先級為:6 // ||的優先級為:5 // ...?...:...的優先級為:4 所以上面的執行順序為(括號的優先級最高為20): ((a && b) || c) ? (c || b) ?…

CodeForces 1009B(思路)

本來打算打打cf找找自信的&#xff0c;結果&#xff0c;死在了一個2000多人都做出來的B上&#xff0c;寫了170多行wr在t4&#xff0c;大佬十幾行代碼就過了&#xff0c;難受啊。 #include <iostream> #include <cstring> #include <algorithm> #include <…

Delphi及C++Builder經典圖書一覽表(持續更新中2018.01.02)

序號書名原版書名作者譯者出版社頁數年代定價備注1CBuilder 5程序設計大全CBuilder 5 Developer’s GuideJarrod Hollingworth康向東、汪浩、黃金才等機械工業出版社13932002.1138.00元2CBuilder應用開發大全Borland C Builder 3 UnleashedCharlie Calvert,et al.徐科、馮焱、呂…

javascript --- 非交互、交互、協作、任務

非交互: var res {};function foo(results) {res.foo results; }function bar(results) {res.bar results; }ajax( "http://some.url.1", foo); ajax( "http://some.url.2", bar);// foo和bar彼此不相關,誰先執行都無所謂..不影響執行結果交互: // 交…

ES5-6 作用域、作用域鏈、預編譯、閉包基礎

1. 作用域 上一級在執行時&#xff0c;內部函數被定義&#xff0c;內部函數便生成作用域和作用域鏈&#xff08;拿上一級的環境&#xff09;&#xff0c;內部函數執行前生成自己的AO&#xff0c;并排在頭部函數執行結束時&#xff0c;AO被銷毀&#xff08;回到被定義時的狀態&…

electron 項目的搭建方式,借助 node 和 npm

1&#xff0c;首先確定安裝了 node 和 npm 2&#xff0c;創建一個文件夾&#xff0c;如 aa 3&#xff0c;CMD 命令進入到 aa&#xff0c;用 npm 命令初始化一個項目 4&#xff0c; npm -init 根據提示完成配置 5&#xff0c;安裝 electron > npm i -D electronlatest, 這一…

zbb20171215 git 版本回退

1. 使用git log命令查看所有的歷史版本&#xff0c;獲取某個歷史版本的id&#xff0c;假設查到歷史版本的id是139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96。 2. git reset --hard 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96 3. 把修改推到遠程服務器 git push -f -u origin ma…

ES5-7 立即執行函數、閉包深入、逗號運算符

1. 立即執行函數 定義在全局的函數只有關閉瀏覽器或者退出程序才會釋放IIFE: Immediately-Invoked Function Expression解決頁面加載自動執行&#xff0c;執行完成后立即釋放&#xff08;避免了只會執行一次的內容一直存在于全局&#xff09;IIFE用匿名函數或者函數聲明&#…

es6 --- 解構賦值的簡潔性

設想你有一個工具foo,它可以異步產生兩個值(x和y): function getY(x) {return new Promise( function(resolve, reject) {setTimeout( function() {resolve( (3*x) -1 );}, 100);}); }function foo(bar, baz) {var x bar * baz;return getY(x).then( function(y){return [x, …

redis安裝(linux)

一、redis安裝步驟 1、yum install gcc 如果你機器已經安裝了編譯環境請忽略&#xff0c;否則在使用make編譯源碼時會報錯。 報錯信息&#xff1a;make: *** [adlist.o] 2、使用wget命令下載包  wget http://download.redis.io/releases/redis-4.0.6.tar.gz 3、解壓tar包 tar…

驗證碼何時可以退出歷史舞臺?

驗證碼是有必要存在的&#xff0c;只是不同階段表現形式不同&#xff0c;未來的趨勢是更加智能無感知&#xff0c;用戶體驗更好。 簡而言之&#xff0c; 驗證碼其終極目的&#xff0c;就是區分正常人和機器的操作。區分人機行為是必要的&#xff1a;互聯網上各種行為&#xff0…

ES5-8 閉包高級、對象、構造函數、實例化

1. 對象 對象內定義的函數一般稱之為方法&#xff0c;在外部的函數聲明稱為函數對象刪除屬性使用delete 關鍵字 var obj {a: 1,b: string } console.log(obj, obj) // {a: 1, b: "string"} delete obj.b console.log(obj, obj) // {a: 1}在對象里&#xff0c;this…

es6 --- 使用生成器交替執行

考慮以下場景: var a 1; var b 2;function foo(){a;b b * a;a b 3; }function bar(){b--;a 8 b;b a * 2; }foo(); bar(); console.log(a, b); // 11 22bar(); foo(); console.log(a, b); // 183 180對于上面的兩個函數foo和bar,它們中的任何一個,一旦開始了就會…

oracle-group by -having

1、GROUP BY 語句用于結合合計函數&#xff0c;根據一個或多個列對結果集進行分組。(也就是說group by 和聚合函數結合起來使用&#xff0c;要查詢的結果來沒有聚合函數則報錯&#xff1a;不是group by 表達式) a、where 不能放在group by 后面使用 b、having 要和group by 連在…

【轉載】匯編速查手冊

一、數據傳輸指令 ─────────────────────────────────────── 它們在存貯器和寄存器、寄存器和輸入輸出端口之間傳送數據. 1. 通用數據傳送指令. MOV 傳送字或字節. MOVSX 先符號擴展,再傳送. MOVZX 先零擴展,再傳送. PUSH 把字壓…

ES5-9 【utils】構造函數及實例化原理、包裝類

1. 構造函數 調用構造函數實際會經歷4步 1 創建一個新對象 2 將構造函數的作用域賦值給對象&#xff08;因此this就指向了這個對象&#xff09; 3 執行構造函數中的代碼&#xff08;為這個新對象添加屬性&#xff09; 4 返回新對象 在構造函數內部&#xff0c;this指向構造函數…