这里写目录标题
1. 函数的定义和调用
1.1 函数的定义
1…自定义函数(Function命名函数)
function fn() {};
2.函数表达式 (匿名函数)
var fun = function() {};
3.利用 new Function()
var fn = new Function('参数1','参数2'..., '函数体')
4.对象的方法
对象的方法
var o = {
sayHi: function() {
console.log();
}
sayHello:function(){
}
}
5.绑定事件函数
btn.onclick = function() {}// 点击了按钮就可以调用这个函数
6.定时器函数
setInterval(function() {}, 1000); 这个函数是定时器自动1秒钟调用一次
7.立即执行函数
(function() {函数体 })();//立即执行
8.构造函数
function Star() {};
new Star();
- Function 里面参数都必须是字符串格式
- 所有函数都是 Function 的实例(对象)
- 函数也属于对象
1.2 函数的调用
- 普通函数
- 对象的方法(函数.方法)
- 构造函数
- 绑定事件函数(操作之后调用)
- 定时器函数(过多少秒自动调用一次)
- 立即执行函数(自动调用)
2. this
2.1 函数内 this 的指向
2.2 改变函数内部 this 指向
- call 方法
fun.call(thisArg, arg1, arg2, ...) // this指向,参数,参数
- apply 方法,(伪)数组
fun.apply(thisArg, [argsArray])//this指向,数组(传递的值)
- bind 方法,不会调用函数
fun.bind(thisArg, arg1, arg2, ...)//返回由指定的 this 值和初始化参数改造的原函数拷贝
区别点:
- call 和 apply 会调用函数, 并且改变函数内部this指向.
- call 和 apply 传递的参数不一样, call 传递参数 aru1, aru2…形式 apply 必须数组形式[arg]
- bind 不会调用函数, 可以改变函数内部this指向.
主要应用场景:
- call 经常做继承.
- apply 经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
- bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向
3. 严格模式
3.1 什么是严格模式
消除了 Javascript 语法的一些不合理、不安全之处,提高编译器效率,增加运行速度,保证代码运行的安全,禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,比如一些保留字不能作为变量名
3.2 开启严格模式
- 为脚本开启严格模式
<script>
(function (){
"use strict";
function fn() {}
})();
</script>
- 为函数开启严格模式( "use strict"声明放在函数体所有语句之前)
function fn(){
“use strict”;
return “这是严格模式。”;
}
3.3 严格模式中的变化
-
变量规定
① 严格模式下变量都必须先用var 命令声明,然后再使用。
② 严禁删除已经声明变量。例如,delete x; 语法是错误的。 -
严格模式下 this 指向问题
①严格模式下全局作用域中函数中的 this 是 undefined
,不在指向window。
② 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错
③ new 实例化的构造函数指向创建的对象实例
④ 定时器 this 还是指向 window
⑤ 事件、对象还是指向调用者。 -
函数变化
① 函数不能有重名的参数。
② 函数必须声明在顶层,不允许在非函数的代码块内声明函数。
4. 高阶函数
高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出。
5. 闭包
5.1 变量作用域
变量根据作用域的不同分为两种:全局变量和局部变量。
- 函数内部可以使用全局变量。
- 函数外部不可以使用局部变量。
- 当函数执行完毕,
本作用域内的局部变量会销毁
。
5.2 什么是闭包和作用
闭包(closure)指有权访问另一个函数作用域中变量的函数
简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。
<script>
function fn() {
var num = 10;
function fun() {
console.log(num);
}
fun();
}
fn();
闭包作用:延伸变量的作用范围。
5.3 在 chrome 中调试闭包
打开浏览器,打断点,找到 Scope 选项(global 全局作用域、local 局部作用域)
6. 递归
6.1 什么是递归?
函数内部自己调用自己, 这个函数就是递归函数,递归函数的作用和循环效果一样
由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件 return
用递归函数求斐波那契数列(兔子序列) 1、1、2、3、5、8、13、21…
function fb(n) {
if (n === 1 || n === 2) {
return 1;
}
return fb(n - 1) + fb(n - 2);
}
7.拷贝
7.1浅拷贝
浅拷贝只是拷贝一层
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
}
};
var o = {};
Object.assign(o, obj);
7.2深拷贝
深拷贝拷贝多层, 每一级别的数据都会拷贝.
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
},
color: ['pink', 'red']
};
var o = {};
// 封装函数
function deepCopy(newobj, oldobj) {
for (var k in oldobj) {
// 判断我们的属性值属于那种数据类型
// 1. 获取属性值 oldobj[k]
var item = oldobj[k];
// 2. 判断这个值是否是数组
if (item instanceof Array) {
newobj[k] = [];
deepCopy(newobj[k], item)
} else if (item instanceof Object) {
// 3. 判断这个值是否是对象
newobj[k] = {};
deepCopy(newobj[k], item)
} else {
// 4. 属于简单数据类型
newobj[k] = item;
}
}
}
deepCopy(o, obj);
console.log(o)