1.函数的定义及调用
自定义函数(命名函数),this => window function fn(){}; fn(); fn.call();
函数表达式(匿名函数), var fn = function(){}; fn();
利用new Function var fn = new Function(‘a’,‘b’,‘console.log(a+b)’); fn(1,2)
对象的方法,this => 对象o var o = {say:function(){}}; o.say();
构造函数,this => star实例对象 function Star(){}; var star = new Star()
绑定事件函数,this => 调用者 btn.onclick = function(){};
定时器函数,this => window setInterval(function(){},1000)
立即执行函数,this => window (function(){})();
2.改变函数内部的this指向
call()方法:可以调用函数,可以改变this指向;主要作用是实现继承
apply)()方法:可以调用函数,也可以改变this指向,但是它的参数必须是数组,输出的是字符串;主要作用是给数组添加方法
bind()方法:不会调用函数 ,只能改变this指向,返回的是原函数改变this之后产生的新函数,需要调用新函数;主要作用是有的函数不需要立即调用,但又要改变this指向,比如定时器
3.严格模式
严格模式:消除了语法的不合理,消除代码运行的不安全,禁用未来版本的一些语法
为整个脚本(script标签)开启严格模式, ‘use strict’ ,写在所有js代码之前
为某个函数开启严格模式,‘use strict’ ,写在函数内部,其他代码之前
3.1严格模式中的变化
变量必须先声明 再使用
不能随意删除已经声明好的变量
严格模式下全局作用域中函数的 this 是 undefined
严格模式下,如果构造函数不加 new 调用,this 会报错
定时器 this 指向还是window
严格模式下,不能有重名的参数
4.高阶函数
4.1闭包
闭包:有权访问另一个函数作用域中变量 的函数
作用:延伸了变量的作用范围
function(){
var num = Math.random()//局部变量num一直在
function fun(){
return num;
};
return fun
};
var res = fn();//res现在是函数fun()
var res1 = res();
var res2 = res();//res1和res2输出的永远是同一个num
//闭包应用,3秒钟之后打印所有li元素的内容
var lis = document.querySelectorAll('li')
for(var i = 0; i < lis.length; i++){
(function(i){
setTimeout(function(){
console.log(lis[i].innerHTML);
},3000)
})(i)
}
4.2递归
函数内部自己调用自己 ,这个函数就是递归函数
递归里面必须加退出条件
//比如求阶乘
function fn(n){
if(n == 1){
return 1;
}
return n * fn(n - 1);
}
console.log(fn(3));
var data = [{
id:1,
name:'家电',
goods:[{
id:11,
name:'冰箱'
},{
id:12,
name:'洗衣机'
}]
},{
id:2,
name:'服饰'
}]
//输入id号,就可以返回数据对象
//1、利用forEach遍历每一个对象
function getID(json,id){
var obj = {};
json.forEach(function(item){
if(item.id == id){
obj = item;
//2、利用递归得到里层数据
}else if(item.goods && item.goods.length > 0){
obj = getID(item.goods,id);
};
});
return obj;
};
console.log(getID(data,1));
console.log(getID(data,11));
console.log(getID(data,12));
5.浅拷贝与深拷贝
浅拷贝 :只拷贝一层,更深层次对象级别的只拷贝引用。新对象和原对象指向同一个地址 ,修改值,两个对象相互影响
深拷贝 :拷贝多层,每一级别的数据都会拷贝。新对象和原对象指向不同的地址 ,修改值,两个对象互不影响。需要用递归判断拷贝的值属于哪种数据类型
es6中新增的浅拷贝方法:Object.assign(new,old)