`
sfh
  • 浏览: 4536 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Javascript笔记之 函数中的this

阅读更多

这个很有搞头,简单看两个例子,说说我个人的理解吧:

 

例一.

 

var aa=11; 
Test(); 
alert(aa);

function Test() 
{ 
  var aa=33; 
  alert(this.aa);
  this.aa = 22; 
  alert(this.aa);
  alert(aa);
} 

alert(new Test().aa);

 

这段代码运行结果是:

[11] [22] [33] [22] [undefined] [22] [33] [22]

 

一点个人理解:

  • 这段带码运行在window对象上,浏览器似乎将var定义的变量全部当成window对象的属性,若一个变量未用var定义,却在程序中被赋值,那么浏览器将先为window对象创建该属性,并给该属性赋值;
  • 任何函数中的this代表调用该函数的对象,如果没有任何对象调用该函数(直接让函数执行),那么就相当于是window对象调用该函数执行(其中的this就代表window对象);
  • 对于new Test()这样的写法其实可以看做新建一个空对象,然后让该空对象调用Test()函数;在悟透javascript一书中李占说:var aObj = new func()就等价于 var aObj = {}; func.call(aObj);

代码第一次调用Test()时,this对应的对象是window,第二次this对应的对象是一个匿名的Object。

 

 

例二.

 

var Foo = {Name:'Foo'};

function OuterFoo()
{
	this.Name = 'Outer Name';
	function InnerFoo()
	{
		var Name = 'Inner Name'; 
		alert(Name + ', ' + this.Name);
	}
	
	return InnerFoo;
}

(new OuterFoo())();               // 直接调用InnerFoo, 但是为OutFoo创建了调用对象
alert(window.Name);             // 由于OutFoo有了调用对象, 故而不会为window对象创建Name属性
OuterFoo()();                         // 直接调用InnerFoo, 并且也直接调用了OutFoo
alert(window.Name);            // 由于直接调用了OutFoo, 所以也为window对象创建Name属性并赋值
(new OuterFoo()).call(Foo);  // 用Foo对象调用InnerFoo, InnerFoo当然也就获得了其Name属性

 

这段代码运行结果是:

[Inner Name, undefined] [undefined] [Inner Name, Outer Name] [Outer Name] [Inner Name, Foo]

 

简单分析见注释部分。

 

总而言之,function中的this指向调用它的对象, 默认的调用它的对象为window。

呵呵,刚刚看到其他的帖子这样描述this:有奶就是娘,很贴切啊!

还有其他的一些常见的讨论,见下面的讨论贴:

http://www.iteye.com/topic/189102

http://www.iteye.com/topic/122569

 

分享到:
评论
5 楼 sfh 2009-06-06  
<div class="quote_title">司徒正美 写道</div>
<div class="quote_div">
<pre name="code" class="javascript">(new OuterFoo())(); //利用匿名对象调用OuterFoo生成InnerFoo,再利用window对象去调用InnerFoo,
                    //因为window.Name为undefined,所以得出Inner Name,undefined;
alert(window.Name); //如上所说:undefined
OuterFoo()();       //利用window对象去调用OuterFoo,第一个this.name相当于window.name,
                    //然后继续用window对象去调用InnerFoo, 得出Inner Name,OuterName
alert(window.Name); //window.Name已经在上面被赋值了,即OuterName
(new OuterFoo()).call(Foo);  //先利用匿名对象调用OuterFoo生成InnerFoo,再用Foo对象调用InnerFoo, 得出Inner Name,Foo

</pre>
</div>
<p> </p>
<p> </p>
<p>呵呵,解释的很详细,我说的太笼统了~</p>
4 楼 司徒正美 2009-06-05  
(new OuterFoo())(); //利用匿名对象调用OuterFoo生成InnerFoo,再利用window对象去调用InnerFoo, 
                    //因为window.Name为undefined,所以得出Inner Name,undefined;
alert(window.Name); //如上所说:undefined
OuterFoo()();       //利用window对象去调用OuterFoo,第一个this.name相当于window.name,
                    //然后继续用window对象去调用InnerFoo, 得出Inner Name,OuterName
alert(window.Name); //window.Name已经在上面被赋值了,即OuterName
(new OuterFoo()).call(Foo);  //先利用匿名对象调用OuterFoo生成InnerFoo,再用Foo对象调用InnerFoo, 得出Inner Name,Foo

3 楼 wnzz95391511 2009-06-04  
<div class="quote_title">sfh 写道</div>
<div class="quote_div">
<div class="quote_title">wnzz95391511 写道</div>
<div class="quote_div">好文章~~学习学习<br><br>最后那有一点不怎么懂!<br><pre name="code" class="js">(new OuterFoo()).call(Foo);  // 用Foo对象调用InnerFoo, InnerFoo当然也就获得了其Name属性 
</pre>
<br>这句是如何执行的?</div>
<p> </p>
<p>可以先alert(<span style="white-space: pre;">new OuterFoo()<span style="white-space: normal;">);</span></span></p>
<p>看到返回的是[function <span>InnerFoo(){var Name = 'Inner Name'; alert(Name + ', ' + this.Name);  }]</span></p>
<p>个人感觉 new Func() 时,若Func有返回值且返回值为function或是object类型的话,则返回其返回值,否则,则返回一个空对象{}调用Func之后自身所转变成的对象,相当于:</p>
<p>function New(Func)</p>
<p>{</p>
<p> </p>
<p><span style="white-space: pre;"> </span>var y = {};</p>
<p><span style="white-space: pre;"> </span>var z = Func.call(y); // 返回OutFoo的返回值</p>
<p> </p>
<p><span style="white-space: pre;"> </span>if((typeof(z)=="function") || (typeof(z)=="object")) return(z);</p>
<p><span style="white-space: pre;"> </span>else return(y);</p>
<p>}</p>
<p> </p>
<p>这样就比较容易理解,等于就是InnerFoo.call(Foo);</p>
</div>
<p> </p>
<p>嗯,这下有点理解了~~~感谢!</p>
2 楼 sfh 2009-06-04  
<div class="quote_title">wnzz95391511 写道</div>
<div class="quote_div">好文章~~学习学习<br><br>最后那有一点不怎么懂!<br><pre name="code" class="js">(new OuterFoo()).call(Foo);  // 用Foo对象调用InnerFoo, InnerFoo当然也就获得了其Name属性 
</pre>
<br>这句是如何执行的?</div>
<p> </p>
<p>可以先alert(<span style="white-space: pre;">new OuterFoo()<span style="white-space: normal;">);</span></span></p>
<p>看到返回的是[function <span style="">InnerFoo(){var Name = 'Inner Name'; alert(Name + ', ' + this.Name);  }]</span></p>
<p>个人感觉 new Func() 时,若Func有返回值且返回值为function或是object类型的话,则返回其返回值,否则,则返回一个空对象{}调用Func之后自身所转变成的对象,相当于:</p>
<p>function New(Func)</p>
<p>{</p>
<p>
</p>
<p><span style="white-space: pre;"> </span>var y = {};</p>
<p><span style="white-space: pre;"> </span>var z = Func.call(y); // 返回OutFoo的返回值</p>
<p>
</p>
<p><span style="white-space: pre;"> </span>if((typeof(z)=="function") || (typeof(z)=="object")) return(z);</p>
<p><span style="white-space: pre;"> </span>else return(y);</p>
<p>}</p>


<p> </p>
<p>这样就比较容易理解,等于就是InnerFoo.call(Foo);</p>
1 楼 wnzz95391511 2009-06-03  
好文章~~学习学习

最后那有一点不怎么懂!
(new OuterFoo()).call(Foo);  // 用Foo对象调用InnerFoo, InnerFoo当然也就获得了其Name属性  

这句是如何执行的?

相关推荐

    狂神说系列 JavaScript笔记

    以上只是【狂神说系列 JavaScript笔记】中可能涵盖的部分知识点,通过深入学习和实践,你将能够掌握JavaScript的核心概念,从而在Web开发领域游刃有余。无论你是前端工程师还是全栈开发者,这份笔记都能为你的...

    javascript笔记之匿名函数和闭包.docx

    在JavaScript中,匿名函数是一种没有名称的函数,通常作为参数传递或者用于立即执行。在上述文档中,我们看到几种不同的匿名函数使用方式: 1. **匿名函数自执行**:`(function(){})()`,这种写法会立即执行该匿名...

    个人Javascript学习笔记 精华版

    本资源为个人Javascript学习笔记的精华版,涵盖了Javascript的基础知识、事件处理、对象和系统函数、浏览器对象等方面的内容。下面是对每个知识点的详细说明: 1. 什么是JavaScript? JavaScript是一种脚本语言,...

    javascript笔记之匿名函数和闭包

    JavaScript中的匿名函数和闭包是两个非常重要的概念,它们在函数式编程和模块化开发中起着关键作用。 首先,让我们来理解匿名函数。匿名函数,顾名思义,是没有名称的函数。在JavaScript中,我们可以直接定义一个不...

    javaScript达内培训笔记

    函数是JavaScript中的重要组成部分,允许代码复用和封装。函数定义使用`function`关键字,可以通过参数传递值,内部可以使用`arguments`对象访问所有传入的参数。 ##### 6. 数组(Array) 数组是存储多个值的容器,...

    JavaScript笔记知识点整理图文.pdf

    JavaScript笔记知识点整理图文.pdf是一个非常实用的资源,涵盖了JavaScript的基本概念、变量和数据类型、运算符、控制结构、函数、数组、对象、事件、DOM等领域的知识点,为开发者提供了详细的参考资料。

    JavaScript高级第03天笔记1

    JavaScript 高级笔记 - 函数的定义和调用、this 指向和改变、严格模式 JavaScript 中的函数定义和调用是编程语言的基础。函数可以定义多种方式,包括函数声明、函数表达式和 new Function()。函数的调用方式也多种...

    韩顺平 javascript 笔记 js面向对象 笔记 韩顺平 完整版

    在韩顺平的JavaScript笔记中,他深入讲解了JS面向对象编程的各个方面,包括变量的作用域、对象引用、this关键字的使用以及对象的方法。 首先,变量的作用域在JavaScript中是一个关键概念。带var和不带var声明的变量...

    javascript学习笔记.docx

    这篇学习笔记主要涵盖了JavaScript的基础语法和客户端JavaScript的相关知识。 1. **JavaScript基本语法**: - **变量声明**:未声明的变量尝试读取时会产生错误,而写入未声明的变量会创建一个全局变量。 - **...

    面向对象javascript笔记

    面向对象的JavaScript编程是JavaScript开发中的重要概念,它允许我们以类和对象的...以上就是对"面向对象javascript笔记"所涵盖知识点的详细解析。理解并掌握这些概念对于深入理解和高效地编写JavaScript代码至关重要。

    JavaScript学习笔记之函数记忆

    JavaScript中的函数记忆是一种优化技术,它通过存储函数的先前计算结果来提高性能。函数记忆的主要思想是,如果一个函数被多次调用,并且每次调用的参数相同,那么第二次及之后的调用可以直接从缓存中获取结果,而...

    javascript笔记

    JavaScript中的函数对象可以使用`Function`构造函数创建,如`var demo = new Function("x", "y", "return x+y")`。这允许动态定义函数体。 数组在JavaScript中也扮演着重要角色。可以使用`[]`快速声明数组,或者...

    Javascript学习笔记之函数篇(五) : 构造函数

    Javascript 中的构造函数与其他语言相比也是不同的。任何通过关键字 new 调用的函数都可以当做构造函数。 在构造函数体内,this 指向新创建的对象。如果构造函数体内没有显示的 return 表达式,那么我们就默认返回 ...

    我的javascript学习笔记

    根据提供的文件信息,可以看出这份“我的javascript学习笔记”主要涵盖了JavaScript中的几个关键概念和技术要点,包括正则表达式、AJAX以及一些JavaScript的核心语言特性。接下来将这些知识点进行详细的整理和解释。...

    javascript 高级程序设计 读书笔记(3)

    结合提供的"listutil.js"文件,我们可以深入探讨JavaScript中的实用工具函数和编程技巧。 首先,JavaScript的高级程序设计离不开对对象的理解。在JavaScript中,对象是一种数据结构,用于存储键值对。你可以通过...

    JavaScript基础学习笔记

    JavaScript 基础学习笔记 本资源摘要信息基于黑马视频记录的学习笔记,涵盖了 JavaScript 基础知识点,包括 HTML、CSS、JavaScript、DOM、事件处理等内容。 HTML 和 CSS 基础 * HTML 结构:head、body、title、...

    Javascript学习笔记之 函数篇(二) : this 的工作机制

    在JavaScript中,`this`关键字的使用与其他编程语言有明显区别,它的指向取决于函数被调用的方式。理解`this`的工作机制对于深入学习JavaScript及其原型继承模式至关重要。以下是`this`在JavaScript中五种不同情况下...

    javaScript笔记

    综上所述,这篇JavaScript笔记涵盖了从基础语法到高级特性的全面学习,同时也涉及到了与之相关的工具和技术,如模板引擎Freemarker和开发环境的构建。通过深入理解和实践这些知识点,开发者可以提升JavaScript编程...

Global site tag (gtag.js) - Google Analytics