函数

定义

// 命名函数
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 是 undefined
function fn() { console.log(this); }
// 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错
Object();
//严格模式下,定时器 this 还是指向 window
setTimeout(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]
        }
    }
}