THIS的五種情況匯總:
1、在事件綁定中:給當(dāng)前元素的某事件行為綁定方法,事件行為觸發(fā),此時(shí)方法中的this是當(dāng)前操作元素本身
2、普通方法執(zhí)行看“點(diǎn)”2-1、方法執(zhí)行看前面有沒(méi)有點(diǎn),如果有,點(diǎn)前面是誰(shuí),this就是誰(shuí),如果沒(méi)有,this就是window,或者嚴(yán)格模式下的undefined2-2、自執(zhí)行的函數(shù)一般是window,嚴(yán)格模式下是undefined2-3、回調(diào)函數(shù):一般來(lái)說(shuō)是window,除非在執(zhí)行回調(diào)函數(shù)「內(nèi)部方法」做了特殊處理
3、構(gòu)造函數(shù)執(zhí)行「new 執(zhí)行」 構(gòu)造函數(shù)體中的this是當(dāng)前類的實(shí)例
4、箭頭函數(shù)中(含塊級(jí)上下文)沒(méi)有自己的this,所用的this是上級(jí)上下文「宿主環(huán)境」的this, 箭頭函數(shù)好用但是不能濫用,不涉及this隨便用
5、基于Function.prototype上的call、bind、apply強(qiáng)制改變this指向
1、全局下指的是window
console.log(this);
2、函數(shù)調(diào)用的情況
函數(shù)執(zhí)行就看函數(shù)前有沒(méi)有點(diǎn),如果有,點(diǎn)前面是誰(shuí),this就是誰(shuí),如果沒(méi)有,this就是window,或者嚴(yán)格模式下的undefined
//'use strict'
functionfn(){
console.log(this)
}
fn();//這里的this就是window,在嚴(yán)格模式下就是undefined
varobj={
name:"li",
fn:fn,
}
obj.fn();//這里的this就是obj
自執(zhí)行的函數(shù)一般是window,嚴(yán)格模式下是undefined
//'use strict';
(function(){
console.log(this)//window
})()
回調(diào)函數(shù):一般來(lái)說(shuō)是window,除非在執(zhí)行回調(diào)函數(shù)「內(nèi)部方法」做了特殊處理
<div id="box">11111</div>
<script>
box.onclick=function(){
console.log(this)
}
</script>
</body>
=======================
setTimeout(function(){
console.log(this);
},1000);
THIS練習(xí)題
1、
var name="珠峰培訓(xùn)";
function fn(){
? console.log(this.name)
}
var obj={
? name:"你好世界",
? fn:fn
}
obj.fn();
fn();
(function(){
? this.fn();
})();
答案:你好世界? 珠峰培訓(xùn)? 珠峰培訓(xùn)
2、
var a = 10;
function foo () {
? console.log(this.a)
}
foo();
答案:10
3、
var a = 10;
function foo () {
? console.log('this1', this)
? console.log(window.a)
? console.log(this.a)
}
console.log(window.foo)
console.log('this2', this)
foo();
答案:函數(shù) window window 10 10
4、
let a = 10
const b = 20
function foo () {
? console.log(this.a)
? console.log(this.b)
}
foo();
console.log(window.a)
答案:undefined undefined undefined
5、
var a = 1
function foo () {
? var a = 2
? console.log(this)
? console.log(this.a)
}
foo()
答案:window 1
6、
var obj1 = {
? a: 1
}
var obj2 = {
? a: 2,
? foo1: function () {
? ? console.log(this.a)
? },
? foo2: function () {
? ? setTimeout(function () {
? ? ? console.log(this)
? ? ? console.log(this.a)
? ? }, 0)
? }
}
var a = 3
obj2.foo1()
obj2.foo2()
答案:2 window 3
7、
let obj={
? name:"li",
? fn:(function(n){
? ? ? // 這里的this
? ? ? console.log(this);
? ? ? return function(){
? ? ? ? ? // 這里的this
? ? ? ? ? console.log(this);
? ? ? }
? })(10),
}
obj.fn();
答案:window? 對(duì)象obj
8、
function fn(){
? // 這里的this
? console.log(this);
}
box.onclick=function(){
? ? console.log(this);
? ? fn()
}
答案:box元素? window
9、
var num=10;
var obj={num:20};
obj.fn=(function(num){
? this.num=num*3;
? num++;
? return function(n){
? ? ? this.num+=n;
? ? ? num++;
? ? ? console.log(num);
? }
})(obj.num);
var fn=obj.fn;
fn(5);
obj.fn(10);
console.log(num,obj.num)
答案:22 23 65 30
10、
var obj = {
? name: 'obj',
? foo1: () => {
? ? console.log(this.name)
? },
? foo2: function () {
? ? console.log(this.name)
? ? return () => {
? ? ? console.log(this.name)
? ? }
? }
}
var name = 'window'
obj.foo1()
obj.foo2()()
答案:window? ? obj? obj
11、
varname='window'
varobj1={
name:'obj1',
foo:function(){
console.log(this.name)
}
}
varobj2={
name:'obj2',
foo:()=>{
console.log(this.name)
}
}
obj1.foo()
obj2.foo()
答案:obj1? window
12、
varname='window'
varobj1={
name:'obj1',
foo:function(){
console.log(this.name)
returnfunction(){
console.log(this.name)
}
}
}
varobj2={
name:'obj2',
foo:function(){
console.log(this.name)
return()=>{
console.log(this.name)
}
}
}
varobj3={
name:'obj3',
foo:()=>{
console.log(this.name)
returnfunction(){
console.log(this.name)
}
}
}
varobj4={
name:'obj4',
foo:()=>{
console.log(this.name)
return()=>{
console.log(this.name)
}
}
}
obj1.foo()()
obj2.foo()()
obj3.foo()()
obj4.foo()()
答案:
obj1.foo()()// 'obj1' 'window'
obj2.foo()()// 'obj2' 'obj2'
obj3.foo()()// 'window' 'window'
obj4.foo()()// 'window' 'window'
DOS命令窗口
1、?打開(kāi)dos命令窗口的幾種方法:
1)?window+?r?或者在搜索里面?輸入cmd
2)在資源管理器的當(dāng)前路徑上直接輸入cmd
3)?鼠標(biāo)右鍵?git?bash?here
2、常用的dos命令
dos 是linxu 寫的,用c開(kāi)發(fā)的,我們先來(lái)說(shuō)下linxu 常用的一些命令
打開(kāi)對(duì)應(yīng)的文件夾:cd? 文件夾? ? (確定當(dāng)前目錄下有改文件夾) 比如:C:\Users\Administrator\Desktop\test>cd a.txt
回退到上一級(jí): cd ../
查看當(dāng)前目錄下的文件夾:cd + tab
返回到根目錄:cd + /
創(chuàng)建一個(gè)文件夾:mkdir + 文件名
創(chuàng)建一個(gè)文件:??touch 文件名.txt ,然后按回車。
重命名一個(gè)文件或者文件夾: rename b f
刪除一個(gè)文件夾:rd + 文件夾名 (只能刪除空的文件夾)
刪除一個(gè)文件夾:rd + /s + 文件夾名 (硬刪除,即使里面有內(nèi)容也能刪除)
刪除一個(gè) 文件: del + 文件夾名
清空命令行:cls
切換磁盤命令:D:?/F:/C:?切換到相應(yīng)的盤符
如果不想一個(gè)個(gè)敲路徑,可以用:cd + 把文件拖過(guò)來(lái)? 自動(dòng)生成此路徑(mac 本)
MAC DOS常用命令
調(diào)出終端
? command+空格打開(kāi)搜索欄,搜索term打開(kāi)終端
常用操作
clear 清空屏幕內(nèi)容
pwd 查看當(dāng)前所在目錄位置(路徑)
ls 顯示當(dāng)前目錄下的文件內(nèi)容
ls+路徑 顯示路徑位置目錄下的內(nèi)容
cd -回到上一個(gè)目錄
cd ~回到用戶目錄
/根目錄
./當(dāng)前目錄
../上一級(jí)目錄
mkdir ABC 在當(dāng)前位置下,創(chuàng)建一個(gè)ABC名字的文件夾
touch ABC.c 在當(dāng)前位置下,創(chuàng)建一個(gè)ABC名字的c文件
cd User 進(jìn)去User文件夾
rm ABC.c 當(dāng)前位置下,刪除ABC.c文件
rm -rf User/ 刪除當(dāng)前位置下User文件夾(里面文件都會(huì)刪除)
進(jìn)入文件后vi命令
命令模式(Esc鍵 進(jìn)入)
:q 退出
:w 保存
:wq 保存并退出
:q! 不保存退出
git版本控制系統(tǒng)
?1、git(版本控制系統(tǒng));到底什么是git,git又是做什么的呢
????+?記錄歷史版本信息
????+?方便團(tuán)隊(duì)之間協(xié)作開(kāi)發(fā)
?2、國(guó)內(nèi)常用的版本控制系統(tǒng)
????+?git:分布式管理系統(tǒng)
????+?svn:集中式版本管理系統(tǒng)
????+?分布式和集中式的各自特點(diǎn)
1)svn集中式版本控制系統(tǒng)

2)git 分布式版本控制系統(tǒng)

3、git的安裝:
????>?git官網(wǎng)??https://git-scm.com/downloads
????>?安裝成功后在桌面右鍵會(huì)出來(lái)兩個(gè)git選項(xiàng)(打開(kāi)git?bash?here,然后執(zhí)行g(shù)it?--version)
????>?GIT是linux創(chuàng)始人研發(fā)的工具,所以GIT中的操作大部分都是linux操作命令
4、git的工作原理(分為三個(gè)區(qū))
????+?工作區(qū):我們平時(shí)寫代碼的區(qū)域
????+?暫存區(qū):用來(lái)臨時(shí)存儲(chǔ)代碼
????+?歷史區(qū):生成歷史版本
5、?git的使用
????- 1、git的全局配置
????????+?git?config?--global?--list:查看全局配置信息
????????+?git?config?--global?user.name?'xxx'??
????????+?git?config?--global?user.email?'xxx@xxx'
6、創(chuàng)建本地倉(cāng)庫(kù),完成版本控制
????????+?1、創(chuàng)建本地倉(cāng)庫(kù)
????????????+?git?init(會(huì)默認(rèn)生成一個(gè).git文件夾,這里是存放你本地git倉(cāng)庫(kù)的信息的,不能刪除)
????????????+?shift?+?cmmand?+?.??mac電腦顯示隱藏目錄

+?2、在工作區(qū)編寫代碼完成后,提交到暫存區(qū)
????????????+?git?add?文件名(把指定文件提交到暫存區(qū))
????????????+?git?add?A(把工作區(qū)所有文件提交到暫存區(qū))
????????????+?git?add?.?(把工作區(qū)所有修改的和新增的文件提交到暫存區(qū),不包括刪除的)
????????????+?git?status(查看當(dāng)前文件提交狀態(tài))【紅色代表在工作區(qū);綠色代表在暫存區(qū);沒(méi)有文件,并顯示clear之類的單詞,說(shuō)明文件已經(jīng)提交到歷史區(qū)或者沒(méi)有任何更改】
????????????clear:清屏
????????+?3、把文件提交到歷史區(qū)
????????????+?git?commit?-m'描述'?(把文件提交到歷史區(qū),并生成此次提交的歷史版本)
????????????+?git?log(查看提交的歷史版本信息,不包括回滾)
????????????+?git?reflog(查看所有的歷史版本信息,包括回滾信息)
????????+?4、回滾指定歷史版本的代碼
????????????+?git?reset?--hard?七位歷史版本號(hào)
7、遠(yuǎn)程倉(cāng)庫(kù)的使用
????-?1、介紹遠(yuǎn)程倉(cāng)庫(kù)github
????????+?github是一個(gè)開(kāi)源的代碼分享平臺(tái);每一個(gè)github賬戶都可以把自己的代碼分享到這個(gè)平臺(tái)上,那他就是充當(dāng)中央服務(wù)器的角色,把代碼提交到這個(gè)平臺(tái)上之后,你可以在任何一個(gè)有網(wǎng)絡(luò)的地方去下載代碼,還可以配置下載的權(quán)限
????-?2、創(chuàng)建一個(gè)遠(yuǎn)程倉(cāng)庫(kù)(點(diǎn)擊左上角綠色的按鈕?New)
????????+?Repository?name:新建倉(cāng)庫(kù)的名稱
????????+?Description:新建倉(cāng)庫(kù)的描述
????????+?Public/Private:新建倉(cāng)庫(kù)是公開(kāi)還是私密的
????????+?Initialize?this?repository?with:為倉(cāng)庫(kù)增加初始化文件(暫時(shí)不選)
????????+?綠色按鈕?Create?repository:?創(chuàng)建新的倉(cāng)庫(kù)
????-?3、把本地倉(cāng)庫(kù)的代碼提交到遠(yuǎn)程倉(cāng)庫(kù)
????????+?1、本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)建立連接
????????????+?git?remote?-v(查看本地和遠(yuǎn)程倉(cāng)庫(kù)的連接狀態(tài))
????????????+?git?remote?add?origin?遠(yuǎn)程倉(cāng)庫(kù)地址(和遠(yuǎn)程倉(cāng)庫(kù)的某個(gè)新項(xiàng)目建立連接,origin這個(gè)名可以改,但是大? 家都統(tǒng)一叫這個(gè))
????????+?2、git?pull?origin?master?(拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼到本地)
????????+?3、git?push?origin?master?(推送本地的代碼到遠(yuǎn)程倉(cāng)庫(kù))
????????【要輸入用戶名和密碼?username??password】
????-?4、git?clone?遠(yuǎn)程倉(cāng)庫(kù)地址?倉(cāng)庫(kù)的名字(如果不寫默認(rèn)原倉(cāng)庫(kù)名)
????????+?其真正的開(kāi)發(fā)中,大家都使用這個(gè)
????????+?你們的項(xiàng)目老大把項(xiàng)目骨架搭建好之后你們每一個(gè)項(xiàng)目小組成員都去把遠(yuǎn)程的代碼拉取到你們的本地去開(kāi)發(fā)
????????+?git?clone
面向?qū)ο缶幊蹋?br>
了解面向?qū)ο缶幊趟枷?,需要先了解?duì)象、類、實(shí)例。萬(wàn)物皆對(duì)象,一切都可以看成對(duì)象,什么是類?比如咱們自然界中有很多的生物,咱們可以把這些生物分為:植物、動(dòng)物。。。,那植物就是一個(gè)類,動(dòng)物也是類,動(dòng)物還可進(jìn)行細(xì)分,比如:高級(jí)動(dòng)物、低級(jí)動(dòng)物,都是分類。什么是實(shí)例呢?比如說(shuō)人類是一個(gè)分類,那具體的某個(gè)人,比如:麗麗就是一個(gè)人類中的一個(gè)實(shí)例,我想研究人類有哪些特點(diǎn),就具體的拿這個(gè)人來(lái)研究就行。咱們?cè)趯W(xué)習(xí)js的時(shí)候,也是按照這個(gè)思想去學(xué)習(xí)。
對(duì)象:萬(wàn)物皆對(duì)象
類:對(duì)象的具體細(xì)分,按照功能或者特征進(jìn)行分類
實(shí)例:類中具體的一個(gè)事物(拿出具體的一個(gè)實(shí)例進(jìn)行研究,當(dāng)前類下的其它實(shí)例也會(huì)具有這些特點(diǎn)和特征)
面向?qū)ο螅?面向?qū)ο笫俏覀冋麄€(gè)編程語(yǔ)言中的一個(gè)思想,在編程語(yǔ)言中,對(duì)象是一種泛指(一切研究的事物都是對(duì)象),我們按照一定的功能和特點(diǎn),可以把它劃分成大類和小類,而類中又有很多的實(shí)例,類給實(shí)例賦予了一些公有的屬性方法而實(shí)例自身還可以有自身獨(dú)有的一些屬性和方法,這種偉大的思想就叫面向?qū)ο缶幊趟枷?/p>
一、單例設(shè)計(jì)模式:
單例模式:可以把描述一個(gè)事物的所有屬性放到一個(gè)對(duì)象中,這樣避免了相互的干擾,這就是單例設(shè)計(jì)模式普通單例模式
//普通
varname="劉亦菲";
varage=18;
varsex="女";
varname="胡歌";
varage=18;
varsex="男";
//單例
varobj1={
name:"劉亦菲",
age:18,
sex:"女"
}
varobj2={
name:"胡歌",
age:20,
sex:"男"
}
高級(jí)單例模式
varutils=(function(){
functionfn(){},
vara=2;
//... 在這個(gè)作用域中還有很多的變量和方法,
return{
// 想要把誰(shuí)暴露出去,就放到這對(duì)象中
fn:fn
}
})();
console.log(nameSpace.fn)
二、工廠設(shè)計(jì)模式
把實(shí)現(xiàn)相同功能的代碼進(jìn)行封裝,后期在使用的時(shí)候,只用調(diào)用這個(gè)函數(shù)即可,方便后期的“批量生產(chǎn)”。減少了頁(yè)面中冗余的代碼,實(shí)現(xiàn)了“高耦合低內(nèi)聚”。
varperson1={
name:"lili",
age:18
}
varperson2={
name:"dava",
age:20
}
//....每次都需要重復(fù)的去寫,很麻煩,所以就可以用工廠模式
functionperson(name,age){
return{
name:name,
age:age
}
}
person("lili","18")
person("dava","20")