this是javascript中的关键字之一。他是使用对象自动生成的一个内部对象,只能在对象内部使用。它会根据上下文而进行变化,而且会在不一样的 JavaScript的模式(是否为严格模式)下表现出差别。javascript
this的指向取决于什么地方以什么方式调用,而不是建立时。箭头函数中的 this
的做用域继承自执行上下文,箭头函数自身不绑定 this
,所以 this
的值将在调用堆栈中查找。前端
构造调用
后,js帮咱们作了什么工做:
__proto__
属性指向 原函数的prototype
属性。(即继承原函数的原型);new 绑定 > 显示绑定 > 隐式绑定 > 默认绑定java
1. 默认绑定
function foo(){
var a = 1 ;
console.log(this.a); // 10
}
var a = 10;
foo();
2. 隐性绑定
function foo(){
console.log(this.a);
}
var obj = {
a : 10,
foo : foo
}
foo(); // undefined (默认绑定)
obj.foo(); // 10
// 隐式丢失(引用赋值)
var a = 0;
function foo(){
console.log(this.a);
};
var obj = {
a : 2,
foo:foo
}
//把obj.foo赋予别名bar,形成了隐式丢失,由于只是把foo()函数赋给了bar,而bar与obj对象则毫无关系
var bar = obj.foo;
bar();//0
//等价于
var a = 0;
var bar = function foo(){
console.log(this.a);
}
bar();//0
// 隐式丢失(参数传递)参数传递其实就是一种隐式赋值,所以咱们传入的函数也会被隐式赋值。
function foo(){
console.log(this.a);
}
function doFoo(fn){
//fn其实引用的是foo
fn();//调用位置
}
var obj = {
a:2,
foo:foo
};
var a = "oops,global";//a是全局对象的属性
doFoo(obj.foo);//oops,global
//若是把函数传入内置的函数中结果是同样的
function foo(){
console.log(this.a);
}
var obj = {
a:2,
foo:foo
};
var a = "oops,global";//a是全局对象的属性
setTimeout(obj.foo,100);//oops,global
3. 显性绑定
function foo(){
console.log(this.a);
}
var obj = { a : 10 };
foo = foo.bind(obj);
foo(); // 10
function foo(){
this.a = 10;
console.log(this);
}
foo(); // window对象
console.log(window.a); // 10 默认绑定
var obj = new foo(); // foo{ a : 10 } 建立的新对象的默认名为函数名
// 而后等价于 foo { a : 10 }; var obj = foo;
console.log(obj.a); // 10 new绑定
// 使用new调用函数后,函数会 以本身的名字 命名 和 建立 一个新的对象,并返回。
//若是原函数返回一个对象类型,那么将没法返回新对象,你将丢失绑定this的新对象。
function foo(){
this.a = 10;
return new String("捣蛋鬼");
}
var obj = new foo();
console.log(obj.a); // undefined
console.log(obj); // "捣蛋鬼"
复制代码
github地址: github.com/ruralist-si…git