zoukankan      html  css  js  c++  java
  • Javascript this

      在上篇执行上下文中,在建立阶段中,工作之一就是this值的赋值,那什么是this呢?一起学习下。

      主要看了王福朋的一篇文章:http://www.cnblogs.com/wangfupeng1988/p/3988422.html

      先看一个例子:

    	var name = "dog";  
    	var nameObj ={  
    	    name : "cat",  
    	    showName : function(){  
    	        alert("this:"+this+";this.name:"+this.name);  
    	    },  
    	    waitShowName : function(){  
    	        setTimeout(this.showName, 1000);  
    	    }  
    	};  
    
    	nameObj.waitShowName();

      结果是:

      由图可知,this是window,而this.name自然就是"dog",可this.name为什么不是"cat"呢?

       根据王福朋的文章,再测试一下几种情况:

      情况1:构造函数

    	function add(){
    		this.name = "niulina";
    		this.age = 24;
    
    		console.log(this);
    	}
    	var a = new add();

      结果:

      所谓构造函数就是用来new对象的函数。而构造函数中的this指代的是拥有属性name,age的对象a。

      

      若不new一个对象出来,那this指代的是:

    	function add(){
    		this.name = "niulina";
    		this.age = 24;
    
    		console.log(this);
    	}
    	add();
    

      结果:

      那在这种情况下,this指代的是window。

       情况2:函数作为对象的一个属性

    	var obj = {
    		x:10,
    		fn:function(){
    			console.log(this);
    			console.log(this.x);
    		}
    	};
    	obj.fn();
    

       结果:

      

      由结果可知:函数fn被作为obj对象的属性,此时的this指代的是obj对象。

      如果把fn单提出来后调用会怎样?

    	var obj = {
    		x:10,
    		fn:function(){
    			console.log(this);
    			console.log(this.x);
    		}
    	};
    	var fn1 = obj.fn;
    	fn1();
    

      结果:

      如果被fn函数被赋给fn1,然后在全局环境中调用,this指的就是window。

      情况3:函数用call或者apply调用

    	var obj = {
    		x:10,
    	};
    	var fn = function(){
    		console.log(this);
    		console.log(this.x);
    	}
    	fn.call(obj);
    

      结果:

      调用call后,this指代的是对象obj,这是因为在call函数中,改变的this的指向。apply函数同理。

      情况4:全局 & 调用普通函数  

    	var x = 10;
    	var fn = function(){
    		console.log(this);
    		console.log(this.x);
    	}
    	fn();
    

      结果:

      由结果可知,在全局环境下,this指代的是window。

      有一个情况比较特殊:

    	var obj = {
    		x:10,
    		fn:function(){
    			function f(){
    				console.log(this);
    				console.log(this.x);
    			}
    			fn();
    		}
    	};
    	obj.fn();
    

      结果:

      f函数在fn函数中定义幷被调用,但其this指代的还是Window。

      所以说:

      一般而言,在Javascript中,this指向函数执行时的当前对象。this关键字在Javascript中和执行环境,而非声明环境有关。

  • 相关阅读:
    第6周编程题:零基础学Java
    帆软报表软件学习计划
    北大软件工程——第八周:面向对象设计2
    hdu1264 Counting Squares
    hdu1264 Counting Squares
    poj1151 Atlantis(线段树+扫描线)
    poj1151 Atlantis(线段树+扫描线)
    bzoj4653 [Noi2016]区间
    bzoj4653 [Noi2016]区间
    Tyvj1043
  • 原文地址:https://www.cnblogs.com/niulina/p/5696292.html
Copyright © 2011-2022 走看看