普通函数,记住三点:
当函数作为对象的方法调用时,this就是该对象;
当函数作为单纯函数调用时,严格模式下,this是undefined,非严格模式下是全局对象,浏览器中就是window;
this不是变量,嵌套函数中的this不会从外层继承this值
var obj = {
func: function() {},
say: function () {
var that = this;
setTimeout(function () {
console.log(this)
that.func()
console.log(that)
});
}
}
obj.say();
优雅做法把this绑定到对象上:
var obj = {
func: function() {},
say: function () {
// 此时的this就是obj对象
setTimeout(function () {
console.log(this)
this.func()
}.bind(this));
}
}
obj.say();call()、apply()、bind() 都是用来重定义 this 这个对象的!
var name="小王",age=17;
var obj={
name:"小张",
objAge:this.age,
myFun:function(){
console.log(this.name+"年龄"+this.age);
}
}
obj.objAgeobj.myFun()
- -------华丽分割线-----------
- var me={
- name:"文",
- age:25
- }
- obj.myFun.call(me) //相当于把this指向me这个对象上
- obj.myFun.apply(me)
- obj.myFun.bind(me)()
- 以上出了bind 方法后面多了个 () 外 ,结果返回都一致!
由此得出结论,bing 返回的是一个新的函数,你必须调用它才会被执行 - function func(sex){
- console.log(sex)
- }
- func.call(me,"男")
- func.apply(me,["男"])
- func.bind(me,"男")()
window.val = 1;
var obj = {
val: 2,
dbl: function () {
this.val *= 2;
val *= 2;
console.log(val);
console.log(this.val);
}
};
// 说出下面的输出结果
obj.dbl();
var func = obj.dbl;
func();
箭头函数:
没有它自己的this值,箭头函数内的this值继承自外围作用域。在箭头函数中调用 this 时,仅仅是简单的沿着作用域链向上寻找,找到最近的一个 this 拿来使用。
箭头函数在定义之后,this 就不会发生改变了,无论用什么样的方式调用它,this 都不会改变;
function foo() {
this.a = 1
let b = () => console.log(this.a)
b()
}
foo()
function foo() {
return () => console.log(arguments[0])
}
foo(1, 2)(3, 4)
let a = {
foo: 1,
bar: () => console.log(this.foo)
}
a.bar()
let a = {
foo: 1,
bar: function() { console.log(this.foo) }
}
a.bar()
function A() {
this.foo = 1
}
A.prototype.bar = () => console.log(this.foo)
let a = new A()
a.bar()
答案在:
http://cnodejs.org/topic/584a207a3ebad99b336b1ede
什么时候应该使用箭头函数:
1、箭头函数适合于无复杂逻辑或者无副作用的纯函数场景下,例如用在map、reduce、filter的回调函数定义中;
2、不要在最外层定义箭头函数,因为在函数内部操作this会很容易污染全局作用域。最起码在箭头函数外部包一层普通函数,将this控制在可见的范围内;
3、如开头所述,箭头函数最吸引人的地方是简洁。在有多层函数嵌套的情况下,箭头函数的简洁性并没有很大的提升,反而影响了函数的作用范围的识别度,这种情况不建议使用箭头函数。
一句话就能讲明白 箭头函数没有this, 它里面的this按照变量查找的形式查找
function foo() {
that = this
this.arrow = () => {
console.log(this.name)
}
this.simulationArrow = () => {
console.log(that.name)
}
this.common = function() {
console.log(this.name)
}
}
var f = new foo()
arrow = f.arrow
simulationArrow = f.simulationArrow
common = f.common
f.name = "foo"
name = "global"
arrow()
simulationArrow()
common()