首先在JavaScript中this中表示的是当前函数执行时的当前对象,其实可以理解成当前function执行时是在哪个对象哪里执行的。 当没有明确的表明执行对象的时候,this是指向全局对象window,而在Node是global
我们通过题目去了解关于this(本文讲的都是不在严格模下的this指向)
题目一
var someone={ name:'Bob', showName:function () { alert(this.name) } }; var other={ name:'Tom', showName:someone.showName //其实这里没有执行function,只是相当于把showName复制
}; other.showName();//Tom
题目二
var name='window'; var someone={ name:'Bob', showName:function () { alert(this.name) } }; var other={ name:'Tom', showName:someone.showName }; var show=someone.showName; 因为当前声明的show是一个全局变量,所以this指向的是window show();//window,可以可以看成是window.show();
题目三
var name='window'; var someone={ name:'Bob', showName:function () { alert(this.name) } }; var other={ name:'Tom', showName:function () { var fun=someone.showName;//因为这里的fun没有绑定任何的执行对象,所以默认指向window fun(); } }; other.showName();//window
在浏览器中setTimeout、setlnterval和匿名函数执行时都是指向当前全局对象window
题目四
var name='bob'; var nameObj={ name:'Tom', showName:function () { alert(this.name) }, waitShowName:function () { ! function (__callback) { console.log(__callback) __callback(); }(this.showName) } }; nameObj.waitShowName(); //bob
eval相当于在该区域填入代码,用法 eval(string)
var Bon={ name:'bob', showName:function () { eavl('alert(this.name)') } }; Bon.showName();
那么问题来了,假如有时候我们需要改变函数执行时的对象,把this指向其他对象,那么应该怎么做呢?
使用apply()、call();
var name='window'; var someone={ name:'bob', showName:function () { alert(this.name); } }; var other={ name:'tom' }; someone.showName.apply();//window someone.showName.apply(other);//tom
其他之间有什么区别?
只有一个区别,就是call()
方法接受的是若干个参数的列表,而apply()
方法接受的是一个包含多个参数的数组。
详细请查看、