函数
定义
// 命名函数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 代码
- 消除了 Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为
- 消除代码运行的一些不安全之处,保证代码运行的安全
- 提高编译器效率,增加运行速度
- 禁用了在 ECMAScript 的未来版本中可能会定义的一些语法
开启严格模式
// 为整个脚本开启严格模式"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] } }}