函數數據庫
函數:函數就是封裝了一段能夠重複執行的代碼塊。數組
function fn(){ console.log('我是函數') } fn(); function getSum(a,b){ return a +b; } console.log(getSum(1, 2));
返回值瀏覽器
function fn2(){ alert('fn2內部的代碼') } console.log(fn2()) //先彈出'fn2內部的代碼',而後控制檯打印undefined 小細節 : break ,continue ,return 的區別 break 結束當前的循環體 (for while ) continue 跳出本次循環,繼續執行下次循環(for while ) return 返回return 中的值 同時結束當前的函數體內的代碼
arguments的使用服務器
JavaScript中,arguments對象是比較特別的一個對象,其實是當前函數的一個內置屬性。也就是說全部函數都內置了一個arguments對象,arguments對象中存儲了傳遞的全部的實參。arguments是一個僞數組,所以及能夠進行遍歷函數
僞數組定義:學習
a.具備length屬性;
b.按索引方式儲存數據;
c.不具備數組的push,pop等方法;this
當咱們不肯定有多少個參數傳遞的時候,能夠用arguments 來獲取code
定義函數有兩種方式對象
// 命名函數 有函數名 爲 fn function fn() { ....} // 調用 那個地方調用均可以 fn()
語法格式:索引
// 這是 函數表達式 寫法 匿名函數後面跟分號結束 var fn = function () { .... }; // 調用的方式 可是這個方式,函數調用必須寫到函數體下面 fn();
自執行函數(瞭解)
(function () { alert('我是匿名函數,被自執行啦~~!'); })();
匿名函數自動執行寫法的,最大的好處,就是 防止命名衝突, 這種函數永遠不會衝突。
值類型和引用類型
var num1 = 10; var num2 = num1; num1 =20; console.log(num1); //20 console.log(num2); //10
棧速度比堆快。
fnuction Person(name,age){ this.name = name; this.age = age; } var p1 = new Person('zs',18); var p2 = p1; //複製引用 p2.name = 'ls'; console.log(p1.name); //ls console.log(p2.name); //ls
做用域
全局變量和局部變量
注意
在函數內部不聲明直接賦值使用的變量也算是全局變量
函數的形參實際上就是局部變量
局部變量當其所在的代碼塊被執行時,會被初始化,當代碼塊運行結束後,就被銷燬了,節省內存空間。
全局變量由於任何一個地方均可以使用,只有再瀏覽器關閉纔會銷燬,比較佔內存。
只要是代碼,就至少有一個做用域
寫在函數外部的是全局做用域
寫在函數內部的局部做用域
若是函數中還有函數,那麼在這個做用域中就又能夠誕生一個做用域。
根據在內部函數能夠訪問外部函數變量的這種機制,用鏈式查找決定哪些數據能被內部函數訪問。 就稱做做用域鏈。
局部變量,寫在函數內部,當咱們函數執行完畢後,裏面的局部就會自動銷燬,釋放內存,比較節省資源。
全局變量 只有瀏覽器關閉的時候纔會銷燬,比較浪費資源。
做用域鏈:咱們按照鏈式方式去查找,最終決定咱們變量執行那個值的過程(就近原則)
預解析
JavaScript代碼是由瀏覽器中的JavaScript解析器來執行的。JavaScript解析器在運行JavaScript代碼的時候,分爲兩步:預解析和代碼執行
學習預解析可以讓咱們知道 爲何在變量聲明以前訪問變量 值是undefined 爲何在函數聲明以前就能夠調用函數
預解析過程
預解析也叫作變量、函數提高
執行過程
console.log(num2); var num2 = 20; //至關於執行了下面的代碼 var num2; console.log(num2); //undefined; num2 = 20;
什麼是對象?
對象調用:
console.log(star.name) // 調用 名字屬性 console.log(star.age) // 調用 年齡屬性 star.sayHi(); // 調用 sayHi 方法 注意,必定不要忘記帶後面的括號
函數和方法的區別:
new Object 建立對象
var stuObj = new Obect(); stuObj.name = 'james'; stuObj.age = 11; stuObj.sex = true; stuObj.sayHi = function(){ alert('你們好啊~'); }
自定義構造函數
咱們能夠和之前封裝函數同樣, 想建立多個對象,不用一個個的創造對象了。
抽象能夠將具備相同或類似功能的js代碼獨立出來封裝成一個函數,這樣能夠提升代碼的重複利用率,提升代碼書寫的效率,也能夠有效的減小代碼的冗餘。
咱們這個函數裏面封裝的對象, 爲了和之前區別顯示不一樣。 咱們稱爲構造函數。
function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; this.sayHi = function() { alert('個人名字叫:' + this.name + ',年齡:' + this.age + ',性別:' + this.sex); } } var bigbai = new Person('大白', 100, '男'); var smallbai = new Person('小白', 21, '男'); console.log(bigbai.name); console.log(smallbai.name);
new在執行時會作四件事情
this詳解
JavaScript中的this指向問題,有時候會讓人難以捉摸,隨着學習的深刻,咱們能夠逐漸瞭解
如今咱們須要掌握函數內部的this幾個特色
1. 函數在定義的時候this是不肯定的,只有在調用的時候才能夠肯定
2. 通常函數直接執行,內部this指向全局window
3. 函數做爲一個對象的方法,被該對象所調用,那麼this指向的是該對象(誰調用指向誰)
4. 構造函數中的this 對象的實例
// 1. 普通函數 function fn() { console.log(this); // this 指向 window } fn(); // 2 對象方法 var obj = { name: 'zs', dance: function() { console.log(this); that = this; } } obj.dance(); // this 指向 obj console.log(that === obj); // true // 3 構造函數 function Fn() { this.age = '18'; console.log(this) self = this; } var demo = new Fn(); // this 指向 demo console.log(self === demo); // true
對象是封裝了相關屬性和方法的複雜數據類型
本質:對象就是一組無序的相關屬性和方法的集合
注意: 函數用來按功能封裝代碼,對象用來按功能封裝方法和屬性,都起到複用代碼和數據的做用。