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 ( )
function fun ( ) {
return num;
} ;
return fun
} ;
var res = fn ( ) ;
var res1 = res ( ) ;
var res2 = res ( ) ;
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: '服饰'
} ]
function getID ( json, id ) {
var obj = { } ;
json. forEach ( function ( item ) {
if ( item. id == id) {
obj = item;
} 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)