js的this到底是谁?

js中函数的四种调用方式

  1. 作为普通函数来调用时,this的值指向window,准确的说this为null,但被解释成window,在ECMAScript5标准中,如果this为null,则解释成undefinded
    例如:
		console.log(window.xx);//undefinde
		function t(){
     
			this.xx=333;
		}
		t();
		console.log(window.xx);//333
  1. 作为对象的方法来调用时,this指向方法的调用者,即该对象。
    作为方法调用时,
    this指向其调用那一刻的调用者,即母体对象。不管被调用函数,声明时属于方法,还是函数
    例如:
		var obj = {
     xx:333,yy:444,zz:function(){
     console.log(this.xx)}};
		obj.zz();//333
		var obj1={
     xx:123456};
		obj1.yy=obj.zz;
		obj1.yy();//123456  
  1. 函数作为构造函数调用时
    js中没有类的概念,创建对象使用构造函数来完成,或者直接用json格式{}来写对象
		function Dog(name,age){
     
			this.name=name;
			this.age=age;
			this.back=function(){
     
				console.log('this is '+ this.name + '!');
			}
			return 'abc';  
		}
		var dog = new Dog('大黄',2) //dog对象,因为函数作为构造函数运行时,return的值是忽略的,还是返回对象
		console.log(dog);
		dog.back() //this is 大黄!
  • new Dog 发生了一下几个步骤

    1. 系统创建空对象{ },(空对象construcor属性指向Dog函数)
    2. 把函数的this—指向–>该空对象
    3. 执行该函数
    4. 返回该对象
  1. 函数被call apply调用时
    ·语法格式:函数.call(对象,参数1,参数2,……,参数n);
				function t(num) {
     
		            console.log(this.name + '真实年龄是' + this.age);
		            console.log('但他告诉别人他' + (this.age + num));
		        }
		        var lisi = {
      name: '李四', age: 28 };
		        lisi.t = t;
		        lisi.t(-10);  //this指向了lisi对象,但是lisi对象多了一个方法
		        
		        //利用call不把函数赋为对象的属性,也能指向对象
		        var wangwu = {
     name:'王五',age:30};
		        t.call(wangwu,-10);

·解释
fn.call(对象obj,参数1,参数2,……,参数n);
运行如下:
1.fn函数中的this指向—对象obj
2.运行fn(参数1,参数2,……,参数n);

你可能感兴趣的:(javascript,javascript)