1.js中this是如何工作的?
函数中的this的值取决于函数调用的模式:
方法调用模式
当函数被保存为对象的一个属性时,该函数为该对象的方法。函数中this的值为该对象。
var foo = {
name: 'fooname',
getName: function (){
return this.name
}
}
foo.getName(); // this => foo
函数调用模式
当函数并不是对象的属性。函数中this的值为全局对象
note:某个方法中的内部函数中的this的值也是全局对象,而非外部函数的this
function foo(){
this.name = 'fooname';
}
foo(); // this => window
构造器调用模式
即使用new调用的函数,则其中this将会被绑定到那个新构造的对象。
function Foo(){
this.name = 'fooname';
}
var foo = new Foo(); // this => foo
使用apply或call调用模式
该模式调用时,函数中this被绑定到apply或call方法调用时接受的第一个参数。
function getName(name){
this.name = name;
}
var foo = {};
getName.call(foo, name); // this =>foo
改变this值的方法主要有三个:
call、apply、bind
区别在于call和apply都是直接调用,而bind确实生成了一个改变了this指针的新函数,需要再次调用,call和bind的第二个参数都是一个任意值,而apply的必须是一个数组
2.new操作符具体干了什么?
- 创建了一个空对象,并且this变量引用该对象,并且继承了该函数的原型
- 属性和方法被加入到this引用的对象中
- 新创建的对象被this所引用,并且最后隐式返回this