JavaScript中this指向问题

首先在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()方法接受的是一个包含多个参数的数组

    详细请查看call()apply()

 

posted @ 2018-02-08 18:49  MC罗  阅读(154)  评论(0编辑  收藏  举报