函数

定义

// 命名函数function fn(){}// 匿名函数var fn = function(){}// 函数对象 里面参数都必须是字符串格式var fn = new Function('参数1','参数2'..., '函数体')

调用

// 普通调用fn()// 对象的方法obj.fn()// 构造方法new Object()// 事件绑定btn.onclick = function(){}// 定时器函数setInterval(function(){}, 1000);// 立即执行函数(function(){})();

this

调用方式this指向
普通函数调用window
构造函数调用实例对象原型对象里面的方法也指向实例对象
箭头函数调用外层的this
对象方法调用该方法所属对象
事件绑定方法绑定事件对象
定时器函数window
立即执行函数window

改变this指向

call()

function fn(arg1){    console.log(this) // string cxk}// 修改fn函数里面的this指向'cxk'fn.call('cxk','arg1')

apply()

function fn(a, b) {    console.log(a, b)    console.log(this) // obj}var obj = { name: 'cxk' }// 参数使用数组传递fn.apply(obj, [1, 2])

call 和 apply 传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递

bind()

// 返回一个包装函数var f = fn.bind(obj, 1, 2)f()// 调用这个函数,this指向obj

严格模式

JavaScript 除了提供正常模式外,还提供了严格模式(strict mode)。ES5 的严格模式是采用具有限制性 JavaScript变体的一种方式,即在严格的条件下运行 JS 代码

开启严格模式

// 为整个脚本开启严格模式"use strict";...// 在函数中开启严格模式function fn(){    "use strict";}

严格模式中的变化

// 变量未声明不能使用num = 10 // 变量不能删除delete num// 严格模式下全局作用域中函数中的 this 是 undefinedfunction fn() { console.log(this); }// 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错Object();//严格模式下,定时器 this 还是指向 windowsetTimeout(function() {  console.log(this); }, 2000);// 严格模式下不能有重名的函数function a(){}  function a(){} // 不允许在非函数的代码块内声明函数if (condition){    function(){}}

更多变化参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode

高阶函数

闭包

闭包(closure)指有权访问另一个函数作用域中变量的函数

作用:延伸变量的作用范围

function fn(){    var num=1;    return function(){        console.log(num);    }}fn()()

拷贝

var obj = {name:'cxk'}var o ={}Object.assign(o,obj)
function deepCopy(newObj,oldObj){    for (var k in oldObj){        if (oldObj[k] instanceof Array){            newObj[k]=[]            deepCopy(newObj[k],oldObj[k])        }else if(oldObj[k] instanceof Object){            newObj[k]={}            deepCopy(newObj[k],oldObj[k])        }else{            newObj[k]=oldObj[k]        }    }}