# 1、匿名函数

匿名函数就是没有名字的函数

# ① 普通函数

//普通函数,有名字,函数名是 text
 function text(){
    return '迪丽热巴';
}
text();//直接调用函数
// 只是对它没有进行操作,因为它是return返回的,怎么操作呢?
alert(text()); //在页面上弹窗打印
document.write(text()); //在页面上输出
console.log(text()); //在控制台输出

# ② 匿名函数-单独的匿名函数无法运行

//匿名函数,没有名字,单独的匿名函数无法运行
 function(){//会报错
    return '迪丽热巴';
}

# ③ 匿名函数赋值给变量-调用方式和函数调用相似

let text = function(){
    return '迪丽热巴';
}
console.log(text); // 输出函数代码
console.log(text());//输出:'迪丽热巴'

# ④ 匿名函数如何自动执行-()()方式

上面例子将匿名函数赋值给变量,其实就变成普通函数了,那么匿名函数如何自动执行?

//封装成表达式
(function(){       
    alert('迪丽热巴');
})(); 

//()表示执行函数,并且可以传参
(function(sex){       //封装成表达式
    alert('迪丽热巴'+sex);
})('女');


//把匿名函数自我执行的返回值赋值给变量
let text = (function(){
    return '迪丽热巴';
})(); 
//这个时候text就不要加(),不要写成text(),因为上面已经执行了,这里只需要负责怎么操作输出
console.log(text);

//直接执行返回值
console.log((function(){
    return '迪丽热巴';
})());  //输出:  '迪丽热巴'

# ⑤ 匿名函数放在普通函数里面

function text(){
    return function(){ //函数里的匿名函数,产生闭包
        return '迪丽热巴';
    }
 }
 console.log(text);
 console.log(text());
 console.log(text()()); //调用匿名函数       
 //或者 
 let love =  text();
 console.log(love());

# 2、闭包

闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。

# ① 通过闭包可以返回局部变量

function text(){
    var nickname = '迪丽热巴';//局部变量
    
}
console.log(text());// undefined
console.log(nickname);//外面无法访问报错

function text(){
    var nickname = '迪丽热巴';//局部变量
    return function(){
        return nickname;
    }
}
console.log(text()());// '迪丽热巴'

那么问题来了,有同学会想,我将函数体内的局部变量直接返回就完事了,为什么还要通过匿名函数返回?
使用闭包有一个优点,也是它的缺点:就是可以把局部变量驻留在内存中,也就是说,我们函数执行完里面的局部变量调用的时候,会存在内存一会,当你调用完毕之后,它从内存自动销毁掉,你就没有办法在使用它了,如果你使用闭包的话,你就可以把局部变量驻留在内存中,可以避免使用全局变量。(全局变量污染导致应用程序不可预测性,如果你写了大量的全局变量,一个是存在命名的冲突,每个模块都可以调用它、修改它,必将引来灾难,所以推荐使用私有的,封装的局部变量)。

# ② 通过全局变量来累加

var age = 10; //全局变量
function text() {
   age ++; //模块级可以调用全局变量,进行累加
}
console.log(age); //返回:10
text(); //执行函数,累加了
console.log(age); //返回:11   输出全局变量
text(); //执行函数,累加了
console.log(age); //返回:12   输出全局变量
//全局变量好用,但是也比较危险

# ③ 局部变量无法实现累加

function text() {
    var age = 10;
    age ++; //累加
    return age;
}
console.log(text()); //返回:11
console.log(text()); //返回:11,无法实现继续累加,因为又被初始化了
//如果放到外面又变成全局变量, 这个时候可以考虑使用闭包

# ④ 通过闭包实现局部变量的累加

//使用匿名函数实现局部变量驻留内存中实现累加
function text() {
    var age = 10;
    return function() {
        age ++;
        return age;
    }
}
//注意调用 text()()多次调用还是会初始化局部变量age, 我们需要多次调用的是匿名函数
var love = text(); //获得函数赋给变量
console.log(love()); //返回:11     调用匿名函数
console.log(love()); //返回:12     第二次调用匿名函数,实现累加
console.log(love()); //返回:13     普通函数text()只执行一遍,我们多次调用的时候调用的是匿名函数
//可以看到我们使用的是局部变量,外面访问不到age
console.log(age); //报错

但是需要注意:由于闭包里作用域返回的局部变量资源不会被立刻销毁回收,所以可能会占用更多的内存。过度使用闭包会导致性能下降,建议在非常有必要的时候才使用闭包。

console.log(love);//匿名函数会一直存在内存,所以不用的时候要销毁
love = null;  //接触引用,等待垃圾回收,释放内存
console.log(love()); //报错,就不存在了

# ⑤ 循环里的匿名函数取值问题:任何变量都是最后一个值

function text(){
    var arr = [];
    for(var i=0;i<5;i++){
       //希望: arr[0]=0,arr[1]=1,arr[2]=2,arr[3]=3,arr[4]=4
       arr[i] = function(){
          return i;
       }
    }

    //循环已经执行完毕了,i最终是4++=5,那么最终就是5

    return arr;
}
console.log(text());
console.log(text()[0]);
var love = text();
console.log(love[0]());//返回:5
console.log(love[1]());//返回:5
console.log(love[2]());//返回:5
console.log(love[3]());//返回:5
console.log(love[4]());//返回:5
for(var j=0;j<5;j++){
    console.log(love[j]());//发现都是5
}

# 1. 单纯得到i是0,1,2,3,4可以这么写

function text(){
    var arr = [];
    for(var i=0;i<5;i++){
       //希望: arr[0]=0,arr[1]=1,arr[2]=2,arr[3]=3,arr[4]=4
       arr[i] = i;
    }
    return arr;
}
console.log(text());//数组0,1,2,3,4
var love = text();
console.log(love[0]);
for(var j = 0;j<5;j++){
    console.log(love[j])
}
//很多时候,我们开发的需求是写成匿名函数,因为里面有很多程序

# 2. i需要在匿名函数里面,因为匿名函数有很多程序要写

function text(){
    var arr = [];
    for(var i=0;i<5;i++){
       //希望: arr[0]=0,arr[1]=1,arr[2]=2,arr[3]=3,arr[4]=4
       //通过自我及时执行匿名函数
       arr[i] = (function(k){
          return k;
       })(i);
    }
    return arr;
}
console.log(text());//数组0,1,2,3,4
var love = text();
console.log(love[0]);
for(var j = 0;j<5;j++){
    console.log(love[j])
}

# 3. 还可以利用讲匿名函数里面的变量储存到内存中去,感觉像全局变量

function text(){
    var arr = [];
    for(var i=0;i<5;i++){
       //希望: arr[0]=0,arr[1]=1,arr[2]=2,arr[3]=3,arr[4]=4
       //还可以利用讲匿名函数里面的变量储存到内存中去,感觉像全局变量
       arr[i] = (function(k){
          //k其实是在这里,通过下面返回的,i是循环的0,1,2,3,4,所以k也是0,1,2,3,4
          return function(){ //因为闭包可以将变量驻留在内存中,和上一节课累加是一个道理
            return k;
          };
       })(i);
    }

    //已经执行完毕了,为什么k可以是0,1,2,3,4
    return arr;
}
console.log(text());
var love = text();
console.log(love[0]());
for(var j = 0;j<5;j++){
    console.log(love[j]())
}

# 4. 例3还可以改成如下的代码

//自我执行()()
(function(){
    alert('迪丽热巴');
})();
//去掉()报错
function(){
    alert('迪丽热巴');
}();
//赋值给变量又可以自我执行了
var love = function(){
   alert('迪丽热巴');
}();
//所以上面的例子可以去掉()
function text(){
    var arr = [];
    for(var i=0;i<5;i++){
       //希望: arr[0]=0,arr[1]=1,arr[2]=2,arr[3]=3,arr[4]=4
       //还可以利用讲匿名函数里面的变量储存到内存中去,感觉像全局变量
       arr[i] = function(k){
          //k其实是在这里,通过下面返回的,i是循环的0,1,2,3,4,所以k也是0,1,2,3,4
          return function(){ //因为闭包可以将变量驻留在内存中,和上一节课累加是一个道理
            return k;
          };
       }(i);
    }

    //已经执行完毕了,为什么k可以是0,1,2,3,4
    return arr;
}
console.log(text());
var love = text();
console.log(love[0]());
for(var j = 0;j<5;j++){
    console.log(love[j]())
}

总结:遇到在循环中里的匿名函数取变量问题,上面例2、例3、例4大家自由选择写法。

# ⑥ 闭包中的this对象问题

在闭包中使用 this 对象也可能会导致一些问题,this 对象是在运行时基于函数的执行环境绑定的,如果 this 在全局范围就是 window,如果在对象内部就指向这个对象。而闭包却在运行时指向 window 的,因为闭包并不属于这个对象的属性或方法。

//例1
var text = {
    cando:function(){
        return this;
    }
}
console.log(this);//window
console.log(text.cando());//text对象

var text = {
    cando:function(){
        return function(){
            return this;
        };
    }
}
console.log(text.cando()());//window
//我们前面的例子,闭包可以进行累加,通过局部变量来代替全局变量
//其实运行的时候,它就是驻留在内存中,就是模拟的全局变量,所以它就是指向的window

//例2
var nickname = '我是全局变量name';
var text = {
    nickname:'我是text对象里面的nickname',
    getName:function(){
        //return this.nickname;
        return function(){
            return this.nickname;
        }
    }
}
console.log(nickname);
console.log(text.getName()());

如果我希望闭包里面的this指向对象text怎么处理?
处理方式一:对象冒充
详见对象冒充: 章节9.Function类型:函数进阶_4、函数的属性和方法_③ 对象冒充:apply()和 call()方法扩展函数赖以运行的作用域

console.log(text.getName().call(text))

处理方式二:在作用域上操作

var nickname = '我是全局变量name';
var text = {
    nickname:'我是text对象里面的nickname',
    getName:function(){
        //这里作用域的this是text
        var _this = this;
        return function(){
            //这里作用域的this是window
            return _this.nickname;
        }
    }
}
console.log(nickname);// '我是全局变量name'
console.log(text.getName()());// '我是text对象里面的nickname'

# ⑦ 闭包在IE浏览器中的内存泄漏

由于 IE 的 JScript 对象和 DOM 对象使用不同的垃圾收集方式,因此闭包在 IE 中会导致一些问题。就是内存泄漏的问题,也就是无法销毁驻留在内存中的元素。
处理方式很简单,就是 让引用的变量变成null(我们前面讲了好多次了),另外,由于现在IE浏览器已经被抛弃了,所以这个问题不用焦虑处理了。

# ⑧ 匿名函数私有化:匿名函数自我执行模仿块级作用域,将变量私有化保护数据

js没有块级作用域的概念。通过模仿块级作用域,将我们的块级部分,如 for语句,if语句里面的代码封装起来,将里面的变量私有化,可以保护数据、防止数据泄露、可以封装细节、避免变量重命名冲突问题,安全性可控性更高,接下来我们讲一下私有化的问题。
我们前面说过,if语句for语句没有块级作用域,详见:章节10.内置对象:Global、Math对象,变量、作用域和内存问题_4、作用域(执行环境)_③ 没有块级作用域(var 操作符声明的变量)

//块级作用域(私有作用域)
function text(){
    for(var i=0;i<5;i++){ //for语句在其他语言看做是块级作用域(私有作用域),但是js没这个东西

    }
    //因为i在这里还能访问
    console.log(i);
    //就算重新声明,也不会影响之前声明初始化的数据
    var i;
    console.log(i);
    //再次说明js没有块级作用域,如果有这个概念,出了这个范围 i 就应该被销毁了,不能访问。
    //js不会提醒你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不见(如果初始化或者重新赋值,当然还会执行的)。
    i = 100; //又给赋值了
    console.log(i);
}
text();

以上例子说明js没有块级作用域(私有作用域),为了保护数据、防止数据泄露、可以封装细节、避免变量重命名冲突问题,安全性可控性更高,我们可以使用匿名函数自我执行使用块级作用域。

//使用块级作用域(私有作用域)
(function () {
     //这里是块级作用域
})();

function text(){
   //包含自我执行的匿名函数,就可以实现块级作用域(私有作用域)
   (function(){
       for(var i=0;i<5;i++){
           console.log('我是循环里面的i:'+i);
       }
       //这个里面我写了一堆代码,声明了好多变量,nickname,age,sex等等
   })();//出了这个私有作用域,变量立即被销毁
   //出了上面的私有作用域,好多变量,nickname,age,sex等等都销毁了,我可以继续用这些变量
   //程序变量互补干扰,防止了命名冲突
   console.log(i);//报错,无法访问
}
text();

使用了块级作用域(私有作用域)后,匿名函数中定义的任何变量,都会在执行结束时被销毁。这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。

//全局变量
var age = 10;
console.log(age);//用完了,后面不会在用,应该销毁
age = null; //解除引用,但是这句话很烦,没有封装概念
console.log(age);

//可以采用私有作用域(块级作用域)来代替全局,防止变量到处污染
(function (){
    //这里就是全局的私有作用域,代替全局,不污染其他变量
    var age = 10;
    console.log(age);
})();
//出来就访问不到age了,自动销毁了,因为没有指向匿名函数的引用,无需 age = null
console.log(age);

一般来说,我们都应该尽可能少向全局作用域中添加变量和函数。在大型项目中,多人开发的时候,过多的全局变量和函数很容易导致命名冲突,引起灾难性的后果。如果采用块级作用域(私有作用域),每个开发者既可以使用自己的变量,又不必担心搞乱全局作用域。
在全局作用域中使用块级作用域可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域链了。

# ⑨ 私有变量、静态私有变量等

私有变量、静态私有变量、私有函数等知识学完面向对象在学习







# 课程其它章节

# 章节1.课程介绍

# 章节2.javascript基础

# 1、变量

# 2、关键保留字

# 3、语法构成

# 4、数据类型

# 章节3.javascript运算符

# 1、一元运算符

# 2、算术运算符

# 3、赋值运算符

# 4、关系运算符

# 5、逻辑运算符

# 6、字符串、逗号、三元条件运算符

# 7、运算符优先级

# 章节4.流程控制语句

# 1、if语句

# 2、switch 语句

# 3、循环语句

# 4、for...in 语句 枚举对象的属性

# 5、break 和 continue 语句 退出循环语句

# 6、with语句

# 章节5.javascript函数

# 1、函数声明

# 2、函数 return 返回值

# 3、函数的arguments 对象

# 章节6.javascript对象

# 1、创建对象

# 2、对象属性输出、方法(函数)调用

# 3、对象中的方法及应用

# 章节7.javascript数组

# 1、创建及读取数组

# 2、数组中的属性和内置方法:toLocaleString()、valueOf()和 toString()

# 3、数组中的方法:join()、push()、pop()、shift()、unshift()、reverse()、sort()、concat()、slice()、splice()方法

# 4、数组更多操作方法

# 章节8.Date类型:时间和日期

# 1、Date 类型

# 2、格式化日期和时间

# 章节9.Function类型:函数进阶

# 1、函数的声明

# 2、作为值的函数

# 3、函数内部属性

# 4、函数的属性和方法

# 章节10.内置对象:Global、Math对象,变量、作用域和内存问题

# 1、内置对象: Global对象

# 2、内置对象: Math 对象

# 3、变量

# 4、作用域(执行环境)

# 5、 内存问题

# 章节11.匿名函数和闭包

# 1、匿名函数如何自动执行-()()方式

# 2、通过闭包实现局部变量的累加

# 3、循环里的匿名函数取值问题:任何变量都是最后一个值

# 4、闭包中的this对象问题

# 5、 匿名函数私有化:匿名函数自我执行模仿块级作用域,将变量私有化保护数据

# 章节12.javascript基本包装类型

# 1、Number 类型

# ① Number类型静态属性:MAX_VALUE、MIN_VALUE、NaN、NEGATIVE_INFINITY、POSITIVE_INFINITY、prototype
# ② Number类型方法:toString()、toLocaleString()、toFixed()、toExponential()、toPrecision()

# 2、String类型

# ① String类型属性:length、constructor、prototype
# ② String类型通用方法:valueOf()、toLocaleString()和 toString()方法
# ③ String类型方法:charAt(n)、charCodeAt(n)、数组方式截取字符串、concat(str1...str2)、slice(n,m)、substring、substr、indexOf、lastIndexOf、toLowerCase、toUpperCase、toLocaleLowerCase、toLocaleUpperCase、match、search、replace、replaceAll、split、fromCharCode、localeCompare、startsWith、endsWith、includes、trimStart、trimEnd、trim、repeat、魔法字符串

# 3、Array数组的常用方法

# ① 数组中的属性length,数组内置方法toLocaleString()、valueOf()和 toString()
# ② join、push、pop、shift、unshift、reverse、sort、concat、slice、splice
# ③ includes、reduce、find、findIndex、filter、map、forEach
# ④ indexOf、lastIndexOf、at、fill、copyWithin、isArray、es6的扩展运算符、every、some、for...of遍历、keys()、values()、entries()、reduceRight、flat、flatMap、from、of
# ⑤ 集合类型Set()属性方法:size属性、add、has、delete、clear方法,迭代遍历数据:keys()、values()、entries()、for...of遍历,forEach遍历
# ⑥ 小结拓展:获取两个数组交集、并集、差集,获取数组随机元素(验证码)

# 章节13.函数对象数组小结

# ① 对象的方法:for...in(遍历对象)、Object.assign()、Object.create()、Object.freeze()、Object.keys()、Object.values()、Object.entries()
# ② 数组解构:基础用法、省略元素、设置数组元素默认值、嵌套数组(多维数组)的结构赋值、不定元素的解构赋值
# ③ 对象解构:基础用法、重命名解构变量、对象解构时的默认值
# ④ var和let、const的区别
# ⑤ 函数参数默认值:对arguments的影响、对函数length的影响、函数默认表达式、参数默认值的暂时性死区
# ⑥ 函数剩余参数:剩余参数只能出现一个、剩余参数只能放在最后
# ⑦ 展开运算符:针对可迭代对象展开、字面量形式的对象做对象克隆和对象合并

# 章节14.浏览器对象模型BOM及浏览器检测

# ① window 对象:属性和方法、系统对话框、调出打印机print()、网页新建窗口open()、窗口页面的位置:screenX(screenLeft)和 screenY(screenTop)、窗口页面的大小:innerWidth和 innerHeight,outerWidth 和 outerHeight,document.documentElement.clientWidth和document.documentElement.clientHeight
# ② window对象:超时调用:setTimeout()方法、取消超时调用:clearTimeout()方法、间歇调用:setInterval()方法、取消间歇调用:clearInterval()方法、模拟定时器功能,超时调用模拟间歇
# ③ location 对象:获取网址相关信息、assign()方法跳转到指定页面、reload()方法、repalce()方法、获取网址url参数中的键值对、history 对象 : 属性:length,方法:back()、forward()、go(num)
# ④ 获取浏览器相关信息、浏览器插件检测、MIME 类型检测、判断设备是安卓、苹果、是否在微信上面浏览网页、用户查看网页的设备是电脑设备,还是手机设备

# 章节15.网页文档对象模型DOM

# 1、理解DOM

# ① DOM节点树,节点种类:元素节点、文本节点、属性节点

# 2、查找节点信息方法

# ① getElement系列: getElementById()方法,getElementById()方法获取的元素节点属性:tagName、innerHTML等, 获取及设置元素html属性:id,title,style,className等,getElementsByTagName()方法,getElementsByName()方法,getElementsByClassName()方法
# ② querySelector系列: querySelector()方法,querySelectorAll()方法
# ③ 属性操作系列: getAttribute()方法,setAttribute()方法,removeAttribute()方法
# ④ node节点属性: nodeName、nodeType、nodeValue
# ⑤ 层次节点属性: childNodes属性,firstChild 和 lastChild 属性,ownerDocument 属性,parentNode 属性,previousSibling 属性,nextSibling 属性,忽略空白文本节点,attributes 属性

# 3、操作节点

# ① document.write()方法,createElement()方法,appendChild()方法,createTextNode()方法, insertBefore()方法,模拟在指定节点的后面添加一个节点,repalceChild()方法,cloneNode()方法,removeChild()方法

# 4、DOM 类型、扩展、操作内容

# ① DOM 类型: Document类型补充(获取html节点对象,获取body节点对象,获取文档声明:DOCTYPE对象,document.title,document.images,document.links等),Text类型补充(normalize()方法,splitText(num)方法,deleteData删除字符,insertData插入字符,replaceData替换字符,substringData获取字符)
# ② DOM 扩展: scrollIntoView(), children 属性,contains()方法
# ③ DOM操作网页内容:innerText、innerHTML、outerText、outerHTML

# 5、DOM实战:操作表格

# ① DOM创建表格
# ② HTML DOM 来操作表格: 获取表格元素对象, 获取表格的标题对象<caption>,获取表头表尾<thead>、<tfoot>、<tbody>,获取表格的行数,获取表格主体里的行数,获取表格主体内第一行的单元格数量(tr),获取表格主体内第一行第一个单元格的内容(td),删除标题、表头、表尾、行、单元格,HTML DOM 创建一个表格

# 6、操作CSS样式

# ① 行内样式style的获取、赋值、移除属性removeProperty,计算后的样式获取(行内、内联、外联样式):window 对象下getComputedStyle()方法

# 7、操作页面样式

# ① className关键字设置样式,创建函数:hasClass() 判断是否存在某个类名,addClass() 如果不存在的这个类名,添加这个类名,removeClass() 如果存在的这个类名,删除这个类名

# 8、操作CSS外联样式表.css文件

# ① 获取CSSStyleSheet,外联的css样式表对象

# 9、DOM元素尺寸(元素大小)和位置(元素位置)

# ① 获取元素 CSS 大小回顾:通过 style 内联获取元素大小,通过计算getComputedStyle()方法获取元素大小,通过 CSSStyleSheet 对象中的 cssRules属性获取元素大小(需将网页放到服务器上查看)
# ② 获取元素实际大小:clientWidth 和 clientHeight:获取可视区的元素大小,可以得到元素内容及内边距所占据的空间大小,scrollWidth 和 scrollHeight:获取滚动内容的元素大小,offsetWidth 和 offsetHeight:获取元素大小,包含边框、内边距和滚动条
# ③ 获取元素周边大小位置:clientLeft 和 clientTop:获取元素设置了左边框和上边框的大小;offsetLeft 和 offsetTop:获取当前元素相对于父元素的位置;scrollTop 和 scrollLeft:这组属性可以获取滚动条被隐藏的区域大小(滚动条滚动高度宽度),也可设置定位到该区域(定位滚动条); getBoundingClientRect()方法:返回一个矩形对象,包含四个属性:left、top、right和 bottom,分别表示元素各边与页面上边和左边的距离

# 10、动态加载脚本

# ① 动态加载js文件,动态加载样式表

# 章节16.事件

# 1、事件基础知识

# ① 事件处理函数列表
# ② 内联模型
# ③ 脚本模型

# 2、事件处理函数分类

# ① 鼠标事件:click,dblclick,mousedown,mouseup,mouseover,mouseout,mousemove
# ② 键盘事件:keydown,keypress,keyup
# ③ HTML事件(包括表单事件):load,unload,resize,scroll,select,change,input,submit,reset,focus,blur

# 3、事件对象

# ① this 关键字和上下文
# ② 获取事件对象
# ③ 获取鼠标按钮(左键、右键、中间滚轮)
# ④ 可视区及屏幕坐标:clientX,clientY,screenX,screenY,鼠标点击位置距离页面顶部距离(带滚动条)
# ⑤ 修改键:shiftKey对应Shfit 键,ctrlKey对应 Ctrl 键,altKey 对应 Alt 键,metaKey 对应 windows 键,判断是否按下了它们
# ⑥ 键盘事件:键码(键盘上的任意键)keyCode,字符编码(键盘上可以输出字符的键)charCode
# ⑦ 事件对象的常用属性和方法:target,事件冒泡,取消:e.stopPropagation()
# ⑧ 事件对象其他属性方法:relatedTarget(在 mouseover 和 mouseout 事件中获取),e.preventDefault(),contextmenu取消鼠标右击弹出的菜单,鼠标滚轮:mousewheel

# 4、事件绑定

# ① 剖析传统事件绑定问题:同名事件后者覆盖前者,this 传递问题
# ② 现代事件绑定处理函数:添加事件addEventListener(),删除事件removeEventListener(),设置冒泡和捕获

# 章节17.表单处理及错误处理与调试

# 1、表单基础知识

# ① 获取form对象的方法
# ② 提交表单:默认提交form表单按钮type="submit",js中表单提交及阻止提交,让没有提交功能的按钮(其它元素)完成表单提交使用的是form.submit()方法,实现使用键盘 CTRL + enter(回车键)提交数据
# ③ 预防表单数据重复提交,表单重置:按钮重置type="reset",js重置 form.reset()方法

# 2、使用HTML DOM获取表单控件元素

# ① elements属性获取表单控件元素集合
# ② 多个表单字段都使用同一个 name,如单选框多选框,常用属性
# ③ 表单共有字段方法:foucs(),blur(),表单共有的字段事件:blur,change,input,focus

# 3、表单中的文本框

# ① input.value 和 textarea.value 获取输入的内容,defaultValue获取默认设置的value值
# ② 选择文本:使用 select()方法,可以将文本框里的文本选中,并且将焦点设置到文本框中
# ③ 选择部分文本:setSelectionRange()方法,这个方法接受两个参数:索引和长度
# ④ select 事件,选中文本框文本后触发
# ⑤ 获取选择的文本,两个属性:selectionStart 和 selectionEnd
# ⑥ 文本过滤输入(表单验证,文本验证,输入框验证)
# ⑦ 剪切事件:cut,复制事件:copy,粘贴事件:paste,禁用输入法
# ⑧ 利用正则表达式将用户输入的非数字字符替换成空,只留下数字
# ⑨ 输入框自动切换焦点到下一个输入框(类似Tab键),maxlength属性可输入的最大字符长度

# 4、表单中的下拉列表(选择框)

# ① 获取下拉列表对象
# ② 下拉列表多选属性 multiple="multiple"(按住键盘CTRL键进行多选),size显示的行数
# ③ 属性 options(下拉选项的集合)
# ④ 选择选项:选择一项的使用selectedIndex属性,监听的是下拉列表的change事件
# ⑤ 下拉列表动态添加选择项: 使用Option 构造函数,add方法添加选项
# ⑥ 下拉列表动态移除选择项:三种方式(removeChild移除、remove()方法移除和 null 移除)
# ⑦ 下拉列表动态移动选择项(两个下拉列表选项移动)
# ⑧ 下拉列表动态排序选择项(选项排序):属性index
# ⑨ 获取单选框或者多选框选择的值: 判断checked属性是否为真判断选中的项,defaultChecked判断项目原本设置的默认值

# 5、错误与调试

# ① 浏览器错误报告,错误处理:try-catch 语句,finally 子句,错误类型
# ② try-catch使用场景,抛出错误,错误事件error:处理DOM对象产生错误时候使用,比如加载图片失败,错误处理策略,调试技术和调试工具

# 章节18.数据Cookie、XML、JSON

# 1、Cookie、sessionStorage、localStorage

# ② 封装cookie(创建,获取,删除)
# ③ sessionStorage、localStorage

# 2、XML

# ① 创建 XMLDOM 对象(document.implementaion,DOMParser类型创建XMLSerializer类型进行序列化成字符串),解析错误
# ② 加载读取外部xml文件
# ③ XPath操作XML
# ④ 封装XPath操作xml文件

# 3、JSON

# ①JSON 语法,可以表示三种类型的值
# ② 获取外部json文件
# ③ 解析json字符串(将json字符串转成数组对象——json结构数据):JSON.parse()方法
# ④ js原生值数组、对象转成json字符串--JSON.stringify()
# ⑤ toJSON



# 其它学期课程

# 第一学期(学习顺序:01)

第一学期课程专为零基础的学员定制录制的,纯html+css做企业网站的网页,主讲html和css的相关基础知识,flex布局相关知识,封装css基础样式库,引入字体图标及网页开发基础布局思维,完成企业网站网页的开发过程。

[第一学期学习视频]

# 第二学期【第1季】(学习顺序:02)

主讲JavaScript的基础,建议所有学员观看。
[第1季学习文档] [第1季学习视频]

# 第二学期【第2季】(学习顺序:03)

JavaScript中的面向对象,类,ajax,封装js库过渡到jQuery, vue.js基础配置网站页面,建议所有学员观看。
[第2季学习文档] [第2季学习视频]

# 第二学期【第3季】(学习顺序:04)

egg.js基础,响应式网页布局,Bootstrap框架,响应式后台系统管理,完整企业网站前后台开发,建议所有学员观看。
[第3季学习文档] [第3季学习视频]

# 第二学期【第4季】(学习顺序:05)

主要对第三季,同学们开发的企业网站,进行一个完整的上线运维流程的一个讲解,同学们将网站开发完成之后,如何进行上线运维,将项目交付给客户。
[第4季学习文档] [第4季学习视频]

更新时间: 2024年11月19日星期二中午11点54分