JS —— this指向的相关问题
this指的是调用这个函数的对象,比如function a(){alert(this);} 如果你直接执行这个函数a(); 那么它的this指的是window对象,如果document.getElementById("test").onclick=a; 那么this指的是前面那个id为test的结点。你可以用call和apply指定this,具体怎么用可以去网上查。
实例1:
- window.val=1;
- var json={
- val:10,
- dbl:function(){
- this.val*=2;
- }
- }
- json.dbl();
- alert(window.val+json.val); //21
- var dbl=json.dbl;
- dbl()
- alert(window.val+json.val); //22
- json.dbl.call(window);
- alert(window.val+json.val); //24
- window.val=1;
- var json={
- val:10,
- dbl:function(){
- console.log(this);
- this.val*=3;
- //如果dbl.call(window) *=2/window.val=2||*=3/window.val=3
- }
- }
- //json.dbl();
- //alert(window.val+json.val); //21
- //var dbl=json.dbl;
- //dbl()
- //alert(window.val+json.val); //22 —— dbl()_this指向var json的function
- json.dbl.call(window); //call调用一个对象的一个方法,以另一个对象替换在当前执行。
- alert(window.val+json.val); //12 _this指向window.val=2,json.val=10
实例2:
- var someuser = {
- name: 'byvoid',
- func: function() {
- console.log(this.name);
- }
- };
- var foo = {
- name: 'foobar'
- };
- someuser.func(); // 输出 byvoid
- foo.func = someuser.func;
- foo.func(); // 输出 foobar
- name = 'global';
- func = someuser.func;
- func(); // 输出 global
关于使用bind切换this指针等相关:
- function test() {
- var obj = {name: 1};
- window.setTimeout(function () {
- console.log(obj.name);
- }, 1000);
- window.setTimeout(function () {
- console.log(this.name);
- }.bind(obj), 1000);
- }
- test();
- //1
- //1
总结:必然是第一种性能好...原因是call,apply,bind这种绑定this的操作非常耗性能,闭包好一点,除非你用that保留this,不然this丢失了你分分钟都不能debug出来.
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
function Cat(){
this.name = "Cat";
}
var animal = new Animal();
var cat = new Cat();
//通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。
//输入结果为"Cat"
animal.showName.call(cat,",");
animal.showName.apply(cat,[]);
call 的意思是把 animal 的方法放到cat上执行,原来cat是没有showName() 方法,现在是把animal 的showName()方法放到 cat上来执行,所以this.name 应该是 Cat。
“call 的意思是把 animal 的方法放到cat上执行”这个应该是animal.showName调用时候,将animal中的this对象转变为cat,alert(this.name);这时候的this是cat,因此this.name==cat.name,所以输出是Cat