JS高级学习:
函数
1.this的指向问题:
2.call,apply,bind 函数方法
call:可以调用函数,可以改变函数中this的指向
第一个参数:要改变this指向的参数
第二个参数及后面参数:其他参数列表
apply:同call,不同点就是传参列表是数组的样式
bind:不可以调用函数,会把函数作为返回值,可以多次调用。其他同call
三者的区别:
三者都可以改变函数中this的指向
call,apply都可以调用函数,不同之处就是两者的传参方式不同,call是fun.call(thisArg,a,b,c), apply是fun.apply(thisArg,[a,b,c]);
call,bind传参方式相同,不同之处就是bind不可以调用函数,但是会把函数作为返回值。
3.函数的其他成员
a. arguments 实参列表
(在调用函数时,游览器每次都会传递两个隐含的函数 1.函数的上下文对象this 2.封装实参的对象 arguments)
是一个类数组对象,也可以通过索引操作数据,也可以获取长度(argument.length可以获取实参的长度)
即使不定义形参,也可以通过arguments来使用实参
属性:arguments.callee--->对应当前正在指向的函数的对象
b. caller 函数的调用者
c. length形参的个数
d. name函数的名称
4.作用域、作用域链、预解析
a. 作用域:分为 全局作用域 和 局部作用域 ,局部作用域分为函数作用域和块级作用域(if、for、while等)。
b.作用域链:从里到外找
var a= 'a1';
var b= 'b1';
function fun(){
var a = 'a2';
console.log(a); //a2
console.log(b); //b1
}
fun();
console.log(a); //a1
c.预解析:
在当前作用域下,js运行之前,会把带有var和function关键字的事先声明,并在内存中安排好,然后再从上到下执行js语句,预解析只会发生在通过var定义的变量和function上。
只要是通过var定义的,不管是变量,还是函数,都是先赋值undefined,如果是变量,也不管变量有没有赋值,在预解析阶段,都是会被赋值为undefined。
5. 闭包
函数嵌套,内部函数就是闭包(一个函数和它周围状态的引用捆绑在一起的组合)
内部函数没有执行完成,外部函数内存空间不会被销毁
用途:1.模仿块级作用域 2.储存变量 3.封装私有变量
6. 递归
可以在函数内部调用本身;
例子:阶乘
function factorial(num) {
if (num <= 1) {
return 1
}
return num * factorial(num - 1)
}
console.log(factorial(4));
例子:
function fn1() {
console.log(111)
fn2()
console.log('fn1')
}
function fn2() {
console.log(222)
fn3()
console.log('fn2')
}
function fn3() {
console.log(333)
fn4()
console.log('fn3')
}
function fn4() {
console.log(444)
console.log('fn4')
}
fn1(); //111,222,333,444,fn4,fn3,fn2,fn1
正则表达式
1.测试网站: 正则表达式在线测试 | 菜鸟工具
2. 练习网站:编程胶囊-打造学习编程的最好系统
3.元字符串:
其他:
4.一些例子:
a. 验证手机号 ^\d{11}$
b. 验证日期 ^\d{4}-\d{1,2}-\d{1,2}$
c.验证ip地址 ^\d{1,3}\(.\d{1,3}){3}$
等等.....
5.参数
6.正则表达式的一些使用
a.正则匹配
b.正则提取
// 提取工资
var str = "张三:1000,李四:5000,王五:8000";
var array = str.match(/\d+/g);
console.log(array);
c.正则替换
// 1替换所有空白
var str = " 123AD asadf asadfasf adf ";
str = str.replace(/\s/g, "xx");
console.log(str);