目錄javascript
webstorm :
代碼編輯器瀏覽器:
代碼解析器;Git :
是一個工具;用於團隊協做開發項目管理代碼的工具;在工做中用git、svn
svn :
集中式;集中式:
須要一箇中央服務器;每次開發前須要從中央服務器把最新的代碼拉取下來,而後進行開發;而且須要網絡;git :
分佈式;分佈式:
每一個人的電腦都是一箇中央服務器;不須要網絡也能夠進行提交代碼;
window+r : 輸入cmdjava
切換磁盤路徑
- cd + 文件夾名字: 打開相應的路徑
- cd ../ : 回到上一級
- cd / : 回到跟路徑;
- mkdir + 文件名字 : 建立文件夾
- cls : 清除全部的命令
配置Git用戶名和密碼
git config --global user.name "用戶名"android
Git的簡單命令
git add .
: 把全部文件提交到暫存區推送到歷史區以後Git會自動分配一個版本號xxxxxx
,根據版本號能夠回到任何一次修改的位置)紅色
,若是文件在暫存區尚未提交到歷史區,那麼顏色是綠色
的本地代碼- ->暫存區- ->歷史區
git
與創建鏈接時的倉庫名同樣
) master(主分支名
):將歷史區內容推送到遠程倉庫輸入用戶名和密碼es6
本地操做
④ git commit -m "註釋"(將代碼提交到歷史區,並添加註釋)github
遠程倉庫操做
git push origin(倉庫名) master
web
git pull origin master:拉取遠程倉庫代碼
設計模式
GitHib
:是一個開源網站,能夠供你們分享代碼 插件和框架讓本地倉庫和遠程倉庫進行綁定數組
做用域:
代碼執行的空間環境 ===棧內存瀏覽器
瀏覽器的渲染機制:
先造成一個DOM樹和CSS樹,最後兩個樹合成render樹全局做用域 :
當打開瀏覽器時,瀏覽器會造成一個全局的做用域,給當前代碼提供運行環境的;而且存儲基本數據類型值;
- 存儲基本數據類型值
- 基本數據類型存儲到棧內存中,全局做用域是最大的一個棧內存
- window是全局中最大的一個對象,存儲了大量的內置屬性
私有做用域:
一個函數執行的時候就會造成一個私有做用域,函數執行完成(或關閉瀏覽器)就銷燬
塊級做用域:
ES6新增的,除了私有做用域和對象之外全部被一個{}包裹起來的,(三個判斷,三個循環)eval("({a:1})")、for 循環中用let ,會造成父做用域;每循環一次,都會造成一個子做用域;在子做用域中會把當前的i進行保存
函數的形參也是私有變量
//1- function fn(){ //傳入任意參數求和 var total = 0; var len = arguments.length; //(var i = 0;i<arguments.lenth;i++) for(var i = 0;i<len;i++){ var cur = arguments[i]; if(!isNaN(cur)){ //total += arguments[i]; total += cur; } } } //2- in 方法用於檢測對象中是否有該屬性 function fn(){} console.log('fn' in window);//true //'fn'必須加引號,不叫引號就是這個變量對應的值 //3- var a,b,fn = function(){ var a = b = 10; //(var a = b = 10;-->var a = 10;b = 10;) //a變成了局部變量沒法修改外部,b是全局變量,修改了外部 } fn(); console.log(a,b);//undefined 10
http://www.javashuo.com/article/p-ujytkfgn-hv.html
https://blog.csdn.net/longwenjunjie/article/details/48163293
變量提高:
在做用域造成以後代碼執行以前,將全部帶var和function關鍵字的變量提早聲明或定義JS能夠在瀏覽器中農運行 是由於瀏覽器給JS提供了賴以生存的環境,這個環境就是做用域
- var:只是提早聲明;默認值是undefined
- function:既聲明又定義
- debugger:打斷點
造成做用域-變量提高-代碼從上到下執行
var
和帶function
都只是聲明不定義塊級做用域
var
直接賦值就至關於給window直接添加了一個屬性 而且給它賦值var
就至關於子安全局做用域下增長了一個屬性,還給全局對象window增長了一個屬性注意:
帶var
的能夠不賦值,可是也至關於給全局對象window增長了一個屬性. 不帶var
的必需要賦值,不然就會去找全局對象window上是否有這個屬性,沒有這個屬性就會報錯.
- 用逗號分隔的表示連
var
;如:var a = 1,b = 2,c = 3;- 用分號(分號表明代碼段)來分隔的,前面帶
var
的屬於變量,不帶var
的至關於給全局對象window添加了屬性;如:var a = 1;b = 2;c = 3;- 連等 帶
var
的是一個變量,其餘的不帶var
的就至關於給全局對象window添加了屬性
=
左邊==function f3(){ console.log(f4());//打印f3函數體中的內容 console.log(f2());//報錯f2沒有進行變量提高 return function f2(){ //return 後面的內容不進行變量提高 可是下面的代碼要進行變量提高 } function f4(){ console.log(f3); } } f3();
var a = [1]; b = a; b[1] = 'a';//b = [1,'a'] console.log(a);//[1,'a'] b指向了a的地址,修改的時候修改了地址中的屬性以及屬性值
let const聲明的變量不進行變量提高
console.log(fn);//fn() console.log(f);//undefined function fn(){}//函數聲明和定義 var f = function(){}//函數表達式-->箭頭函數
console.log(fn);//fn函數體 console.log(f);//undefined console.log(fn());//打印兩次undefined 函數執行的時候打印f爲undefined,而且函數沒有返回值 打印一次undefined function fn(){ console.log(f); } var f = function(){}//函數聲明
console.log(f2);//f2未定義 報錯 var var f = function f2(){} console.log(f2)//f2未定義 報錯 setTimeout(funtion f2(){},1000)//函數做爲參數的時候不進行變量提高
函數聲明的語法
f('nihao'); function f(name){ console.log(name); } //能打印出nihao
函數表達式語法
f('nihao'); var f = function (name){ console.log(name); } //控制檯報錯 Uncaught ReferenceError:f id not function錯誤顯示f不是一個函數
兩種方式的區別:
函數聲明提高
,函數聲明語句將會被外部腳本或者外部函數做用域的頂部(跟變量提高非長類似)。正是這個特徵,因此能夠把函數聲明放在調用它的語句後面。var getName = function (){ console.log(2); } function getName(){ console.log(1); } getName(); //打印出2
這個例子涉及到了變量聲明提高
和函數聲明提高
.正如前面說起到的函數聲明提高,函數聲明function getName(){}
的聲明會被提早到頂部.而函數表達式var getName = function(){}
則表現出變量聲明提高.所以,在這種狀況下,getName也是一個變量,這個變量的聲明將被提高到底部,而變量的賦值依然保留在原來的位置.須要注意的是:
函數優先,雖然函數聲明和變量聲明都會被提高,可是函數會首先被提高,而後纔是變量。所以上面的函數能夠換成這個樣子
function getName(){ //函數聲明提高到頂部 console.log(1); } var getName;//變量聲明提高 getName = function(){ //變量賦值依然保留在原來的位置 console.log(2); } getName();//最終輸出2
在原來的例子中,函數聲明雖然是在函數表達式以後,可是因爲函數聲明提高到頂部,所以後面getName
又被函數表達式的賦值操做給覆蓋了,因此控制檯輸出了2
console.log(f);//打印函數體 function f(){ console.log(1); } f();//88 function f(){ console.log(2); } function f(){ console.log(3); } f();//88 f = 99; function f(){ console.log(88); } f();//f is not a function console.log(f);
var 與ES6中const 、let聲明的變量的區別
https://blog.csdn.net/qq_22855325/article/details/72843456
let
不能和函數重名
const
聲明的變量,let
雖然不會進行變量提高,可是會先檢查當前做用域下是否有重複命名var a = 2; if('a' in window){ console.log(a);//造成暫時性死區,即在塊級做用域下,不能提早拿到let聲明的變量的值,打印2 let a = 1; }
ES6中提出了一個新的變量,不在於取代var
,而在於解決ES5中var
聲明中的一些痛點;這就是let
let的特色
let
是塊級變量,不存在於window下[非全局屬性],window,變量名
是找不到的,它的做用範圍就那麼一小塊let
不容許從新聲明同名變量,會拋出異常,具備惟一性let
不容許沒聲明就使用,會拋出異常,只有執行該聲明的時候才能使用let
有本身特點的閉包特性,好比在for
循環的應用中//1- let tt = 'nihao'; console.log(tt);//打印出'nihao' console.log(window.tt);//打印出undefined //2- function test2(){ var abc = 99; let abc = 88; console.log(abc); } test2();//打印值:Uncaught SyntaxError:Indentifier 'abc' has already been declared //3- function test3(){ console.log(test3); let test3 = '哈哈哈哈'; } test3();//打印值:Uncaught ReferenceError:test3 is not defined //4-每一次for村換都從新綁定一次做用域且脫離失效,就是let自身的特點 for(let i = 0;i<9;i++){ //for循環造成保護機制 console.log('循環內的值是:'+i); } console.log(i);//打印值 //循環內的值是:0 //循環內的值是:1 //循環內的值是:2 //循環內的值是:3 //循環內的值是:4 //循環內的值是:5 //循環內的值是:6 //循環內的值是:7 //循環內的值是:8 //Uncaught ReferenceError:i is not defined 塊級做用域 外界沒法訪問
一、在當前做用域下輸出變量值時,首先觀察是不是私有變量
var
過和function
過二、若是變量不是私有的,就向上一級做用域查找
但獲取變量值時,首先是不是私有變量,若是不是就向上一級做用域查找,一級一級向上,直到window
爲止,若是window
也沒有,那麼就會報錯,這樣一級一級向上查找做用域就是做用域鏈
造成兩個虛擬內存:棧內存、堆內存
棧內存:做用域
引用數據類型
在JS中的{}[]都是開闢一個新的空間地址
谷歌瀏覽器:
每隔一段時間,自動檢查佔用並是否銷燬
火狐和IE:
採用的計數的規則,當堆內存地址被佔用一次時,計數+1,不然-1,若是是被佔用0次,就回收
函數的執行:
造成一個私有的做用域,提供代碼運行環境,存儲基本數據類型
保護機制:當前私有做用域中,有引用數據類型被外界所佔有,致使當前做用域變成一個不銷燬的做用域,裏面的變量就成了不銷燬的變量
通常狀況下,函數執行完成以後,當前做用域就會銷燬
函數沒執行一次就會開闢一個新的私有做用域,而且新的私有做用域和以前的做用域沒有任何關係,是兩個不一樣的棧內存
不銷燬的做用域:
函數執行return出的引用數據類型值而且被外界接收(被佔用)
瀏覽器加載的時候,碰到引用數據類型,都會開闢一個新的內存空間,[對象:鍵值對;函數:代碼字符串],給這個內存空間賦一個16進制內存地址,將這個內存地址指向聲明的變量,這個內存空間就是堆內存
堆內存的釋放,手動賦值null,[指向空指針];瀏覽器判斷該內存沒有變量就去收回它,就會釋放
function fn(){ var t = 10; return function (){ console.log(t++) } } var f = fn(); f(); f();
不當即銷燬:
function fn(){ var t = 10; return function (){ console.log(t++); } } fn()();
var i = 0; function fn(){ //i = 5 6; return function(n){ console.log(n + i++); } } var f = fn(5); f(10);//15 f(20);//26 fn(8)(12);//20 fn()(18);//NaN
function fn (){ var a = 1 ; return function (){ a++; console.log(a); } } var f = fn(); f(); //2 fn()(); //2 f(); //3
var obj= { i : 10, fn:(function () { var i = 0; return function (n) { console.log(n + i++) } })() }; var f = obj.fn; f(10);// 10 f(20);// 21 obj.fn(30);// 32 塊級做用域 obj.fn(40);// 43
this
,指的就是函數的當前執行主體this
指向window
this
,看函數執行前有沒有'.'
;若是有,那麼'.'
前面是誰,this
就指向誰;若是沒有'.'
,那麼會指向windowthis
,就會指向當前被綁定的那個元素this
指向window
this
通常都指向window
forEach
、map
第二個參數能夠修改回調函數中的this
this
指向當前類的實例this
是誰,和它在哪定義的以及在哪執行的沒有任何關係function b() { console.log(this); //window } window.b(); var obj = { num:1, fn : function () { console.log(this); function m() { console.log(this);// window; } m() } } var f = obj.fn; f(); // window obj.fn();// obj var obj = { num:1, f:{ num:2, fn:function () { console.log(this);// obj.f } } } obj.f.fn()
//1. setInterval(function () { console.log(this); // window },1000) //2. (function () { console.log(this); //window })() //3. var obj = { fn: (function () { console.log(this); //window })() }
var num =2;// 1 2 var obj = { num : 0, fn : function () { num = 1; // this-->obj (function (num) { // this --> window ++this.num; num++; console.log(num)// 1 })(this.num)// 0 } } obj.fn(); console.log(window.num,obj.num) //2 0
this的重點練習題
var num =2;// 1 2 var obj = { num : 0, fn : function () { num = 1; // this-->obj (function (num) { // this --> window ++this.num; num++; console.log(num)// 1 })(this.num)// 0 } } obj.fn(); console.log(window.num,obj.num) //2 0
把一個項目按照頁面或者功能分割成不一樣的任務,交給項目中不一樣的成員開發.開發結束以後
將代碼合併到一塊兒.
爲了防止全局變量污染: 閉包可是閉包並不完美,因此選擇搭配設計模式來進一步進行
項目開發
表現形式:就是一個對象:{name:xxx,age:function(){}};
[空間]
下,避免了全局變量的干擾;這種模式就是單例模式person
不只僅是一個對象名,仍是一個命名空間,多個命名空間是相互獨立的,互不干擾由來:單例模式的本質就是一個對象,它是object類上的一個實例,實例與實例之間互不干擾,叫作單獨的實例,簡稱"單例"
好處:能夠在私有的做用域當中,建立不少的屬性和方法,僅須要把咱們使用的屬性和方法暴露在這個對象當中便可。相對於單例模式,能夠存儲不一樣方法中的公有變量
好處:減小了代碼的冗餘:"高內聚、低耦合"-->函數的封裝
OOP/OP
:面向對象的縮寫,面向對象思想定義:
面向對象的封裝、繼承和多態,經過簡單的實例化,調用其餘的方法和屬性JS
就是經過面向對象的思想設計開發出來的對象:
萬物皆對象,多爲一種泛指,能夠是任何物體類:
對象中具備同一屬性和特徵的集合,類又分爲大類和小類實例:
就是類中的一個具體的細分,咱們研究當前實例具備哪些屬性和方法,那麼證實當前類中的其餘實例也一樣具備
Object對象類,被稱爲基類,在任何數據類型均可以經過__proto__[原型鏈]找到基類Object
引用數據類型方式建立 var ary = new Array('1')
注意:
- new Array(10):建立一個長度爲10的數組,數組中的每一項都是空
- new Array('10'):若是隻傳遞一個實參,而且實參不是數字,至關於把當前值做爲數組的第一項存儲進來
- new Array(10,20,30):若是傳遞多個實參,不是設置長度,而是把傳遞的內容當作數組中的每一項存儲起來
new
關鍵字來執行的時候,這個函數就不是普通函數了,它是一個構造函數,也是一個自定義類,當前的函數名就是類名,這個函數的返回值就是這個類的實例[類名]
let person = new Person
造成做用域後,在代碼運行以前,
首先會給當前的做用域初始化一個空對象;而且讓當前做用域下的this
指向這個空對象 當代碼運行結束,構造函數把函數體中的this做爲返回值返回this
,指向當前的實例在構造函數中,return
一個基本數據類型值,那麼對實例沒有任何影響;若是return
出一個引用數據類型值,那麼會把默認return
的this
替換掉.
this
[堆內存指針指向this
實例]return
,return
默認將實例返回;return
,
構造函數中:建議不要輕易return
引用數據類型
在構造函數中,給this添加屬性值和方法,都屬於當前實例的私有屬性
[公有屬性+私有屬性]
是都屬於這個對象console.log('hasOwnProperty' in person1)
;hasOwnProperty
,這個方法判斷當前屬性是不是該實例的私有屬性:返回布爾值console.log(person1.hasOwnProperty("age")) //true
console.log(person1.hasOwnProperty("valueof")) //false
hasPubProperty
function hasPubProperty(obj,item){ //先檢測是不是屬性 return item in obj &&!obj.hasOwnProperty(item); } console.log(hasPubProperty([], 'toString'));
普通函數、類(自定義類和內置類)、函數類的實例
new
出來的一個實例,也是一個對象函數也是一個對象
prototype(原型)
,它是一個對象,既然是對象,那就是一個堆內存constructor(構造函數)
,它指向當前類自己全部的對象都天生自帶一個屬性__proto__,它指向當前類的原型
function People(name){ let age = 9; this.name = name; this.age = age; } People.prototype.say = function () { console.log(this); }; let person1 = new People('zf'); let person2 = new People('zhufeng'); //person1屬於People類 //__proto__指向類People的原型prototype console.log(person1.__proto__ == People.prototype);//true
定義:一個實例要找屬性,優先會去找本身的私有屬性,若是本身的私有屬性沒有,那就經過__proto__找到本身所屬類的原型上面的公有屬性,若是公有屬性尚未,繼續經過__proto__找到本身的所屬類的原型直到Object[基類]的原型上,一直找到基類尚未的話,直接返回undefined
console.log(Number instanceof Function); //true
console.log(String instanceof Function); //true
console.log(Object instanceof Function); //true
萬物皆對象,JS中的任何數據類型均可以經過proto