1.在Javascript中,this指向函数执行时的当前对象
function foo() {
console.log( this.a );
}
function doFoo() {
foo();
}
- 该处的执行foo()的时候,执行环境为doFoo函数,而该函数为普通函数,this指向window
2.箭头函数时不绑定this的,它的this来自原其父级所处的上下文
var a = 10
var obj = {
a: 20,
say: () => {
console.log(this.a)
}
}
obj.say()
var anotherObj = { a: 30 }
obj.say.apply(anotherObj)
- 该代码的obj对象是在全局定义的,故箭头函数say()方法继承其父级所处的上下文,即windows,所以第一个输出仍然是10,后面虽然让say方法指向了另外一个对象,但是仍不能改变箭头函数的特性,它的this仍然是指向全局的,所以依旧会输出10。
- 若为say为普通函数,其this指向指向他所在的对象,即输出obj其中的a的值
3.如果第一个参数传入的对象调用者是null或者undefined,call方法将把全局对象(浏览器上是window对象)作为this的值
function a() {
console.log(this);
}
a.call(null);
- 输出window对象
- 但若开启了严格模式,null 就是 null,undefined 就是 undefined
'use strict';
function a() {
console.log(this);
}
a.call(null);
a.call(undefined);
4. 使用new构造函数时,其this指向的是全局环境window
var obj = {
name : 'cuggz',
fun : function(){
console.log(this.name);
}
}
obj.fun()
new obj.fun()
5. 对象不构成单独的作用域
var obj = {
say: function() {
var f1 = () => {
console.log("1111", this);
}
f1();
},
pro: {
getPro:() => {
console.log(this);
}
}
}
var o = obj.say;
o();
obj.say();
obj.pro.getPro();
- 调用
o():注意此时调用的环境是在全局作用域下,f1() 箭头函数继承父级say function() 在全局作用域中,故打印出window; obj.say():谁调用say,say 的this就指向谁,所以此时this指向的是obj对象;obj.pro.getPro():由于getPro处于pro中,而对象不构成单独的作用域,所以箭头的函数的this就指向了全局作用域window;