一、关于this的机制
常用遇到的:
- 对象、闭包、原型链继承
- setTimeout/setInterval 执行指向window(global)对象
- 构造函数 new FunName 返回一个新对象
- 箭头函数,箭头函数的this指向所在的环境,可以参考阮一峰的es6入门。
其他相关的this指向:
二、严格模式的相关作用(这里是介绍this,所以不细说)
- 禁止函数内部this关键字指向全局对象
- 检查对象中的重复键
- 未声明变量
- 重复的参数
- 限制函数中的arguments
- 禁止删除变量
用法:全局或者局部作用域顶部加下面代码
"use strict"
三、bind/call/apply(Object.prototype)
函数对象的方法,允许切换函数执行的上下文环境
一般用来指定this的环境
1.call
var a = {
user: '追妹子',
insideFn: function(arguments){
console.log(this.user);
console.log(arguments)
}
}
var outSideFn = function(arguments){
console.log(this.user);
console.log(arguments)
}
a.insideFn.call(a,1,2,3)//=> '追妹子'; [1,2,3]
outSideFn.call(a,1,2,3)//=> '追妹子'; [1,2,3]
2.apply
var a = {
user: '追妹子',
insideFn: function(arguments){
console.log(this.user);
console.log(arguments)
}
}
var outSideFn = function(arguments){
console.log(this.user);
console.log(arguments)
}
a.insideFn.apply(a,[1,2,3,4])//=> '追妹子'; [1,2,3]
outSideFn.apply(a,[1,2,3,4])//=> '追妹子'; [1,2,3]
3.bind
返回值是一个函数,未执行,只修改上下文
var a = {
user: '追妹子',
insideFn: function(arguments){
console.log(this.user);
console.log(arguments)
}
}
var outSideFn = function(arguments){
console.log(this.user);
console.log(arguments)
}
a.insideFn.bind(a)(1,2,3)
outSideFn.bind(a)(1,2,3)
eg:兼容ie6~ie8
if (!function() {}.bind) {
Function.prototype.bind = function(context) {
var self = this
, args = Array.prototype.slice.call(arguments);
return function() {
return self.apply(context, args.slice(1));
}
};
}