函数
定义
// 命名函数
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 是 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]
}
}
}