聊聊javascript中的函数

本文可作为李刚《疯狂htmlcssjavas讲义》的学习笔记

先说一个题外话 前几天在知乎上流传着一个对联 

上联是雷锋推到雷峰塔 nnd 这是什么对联?!!!

下联是java implements javascript  笑而不语 呵呵

说的javascript的函数了 咱们就不妨先说说java里的方法

首先在java里函数(一般叫方法)是从属于类的 和容易理解 Person类有个方法叫walk()

但是在javas里面函数是"一等公民" 它可以独立使用 同时忘掉java中的类的知识点 javascrpit里的方法就是一个类 而且它也只有一个构造方法.

定义函数

先说说定义函数的方法 一共有三种

其一

<script type="text/javascript">
	hello('yeeku');
	// 定义函数hello,该函数需要一个参数
	function hello(name)
	{
		alert(name + ",你好");
	}
</script>

很简单吧 不过似乎有个问题呀 怎么对hello的调用跑到了声明前面去了?

没办法 javascript人家定义了定义了先调用再定义





其二 匿名函数

上面那个函数 它有名字就叫hello 下面这种方法 根本就没有名字

<script type="text/javascript">
	var f = function(name)
	{
		document.writeln('匿名函数<br />');
		document.writeln('你好' + name);
	};
	f('yeeku');
</script>

此时定义的函数它是Function类的一个对象 既然是对象 那它就可以赋给其他变量

上例中我们把匿名函数赋给了f然后让f直接调用函数 (说实话从java转过来的程序员看javascript很别扭)

其三 用Function来定义函数

<script type="text/javascript">
	// 定义匿名函数,并将函数赋给变量f
	var f = new Function('name' ,
		"document.writeln('Function定义的函数<br />');"
		+ "document.writeln('你好' + name);");
	// 通过变量调用匿名函数
	f('yeeku');
</script>

new Function(p1,p2)有两个(组)参数 都是字符串 第一组存放的是定义的函数用的参数,第二组里面就是函数的内部实现了 记住其实就是两个字符串而已.





现在大家看看这三种方式? 哪种好呢?

说实话 我自己比较喜欢第一种 看着舒服

其实只有初级程序员才喜欢第一种(寒) 因为它多了要给对象

对应第三种方式 如果函数体太长 那么定义就会显得很臃肿

因此 第二种是最常用的

函数 方法 对象 类

其实函数是一个多意词

当我们用上面的方法定义了一个函数的时候 就会出现四个概念

函数 我们定义了要给函数,它可以被调用

方法 在匿名函数里 这个函数赋给了一个对象 作为它的方法

对象 我们定义了一个函数 系统也会创建一个对象 这个对象是Function类的一个实例

类   在定义函数的同时 也得到了一个与函数同名的类

看下面的代码

<script type="text/javascript">
	// 定义一个函数
	var test = function(name)
	{
		return "你好," + name ;
	}
	// 直接调用函数
	var rval = test('leegang');
	// 将函数作为类的构造器
	var obj = new test('leegang');
	alert(rval + "\n" + obj);
</script>

试验结果 大家自己复制到记事本里看看

这段代码其实也是示范了两种调用函数的方法

第一种 直接调用 它就是一个函数 rval得到的是函数的返回值

第二种 把他当成一个类 obj得到的就是一个对象

<script type="text/javascript">
	// 定义一个对象
	var p = {
		// 定义一个函数,该函数属于p对象。
		walk: function()
		{
			for(var i = 0 ; i < 2 ; i++)
			{
				document.write("慢慢地走...");
			}
		}
	}
	p.walk();
</script>

说实话这种方式 按面向对象的感觉来看还是蛮舒服的 对象p有一个函数叫walk

 

 另外 在上面的定义函数的方法中

<script type="text/javascript">
	var f = function(name)
	{
		document.writeln('匿名函数<br />');
		document.writeln('你好' + name);
	};
	f('yeeku');
</script>

最后我们是直接调用函数 其实和p walk想比较 walk"挂靠"在了p上面 而f没有挂靠?真的没有么?

大家试试把f('yeeku');改成window.f('yeeku');

明白了吧 其实这个函数如果没有硬性地指定属于某个对象的话 就让他属于window

大家试试在p.walk();后面加上window.walk();看看什么情况 也就能证明 如果一个函数已经属于了一个对象 那么她还会不会属于window

函数的调用方式

也是有三种方式

其一 直接调用

window.alert();  //当使用window调用方法是 window可省略 因此上面的f('yeeku')其实就是window.f('yeeku');

p.walk(); //调用p的对象的walk方法

其二 用call方法调用

这样一种情况 我们需要让一个函数对数字里面每个元素进行处理 代码如下

<script type="text/javascript">
	// 定义一个each函数
	var each = function(array , fn)
	{
		for(var index in array)
		{
			// 以window为调用者来调用fn函数,
			// index、array[index]是传给fn函数的参数
			fn.call(null , index , array[index]);

		}

        document.write("<hr>");
	//常规方式
		for(var index in array)
		{

			// index、array[index]是传给fn函数的参数
			fn(index,array[index]);

		}
	}
	// 调用each函数,第一个参数是数组,第二个参数是函数
	// 4 20 3作为第一个参数
	// 参数就是 下面这个匿名函数
	//function(index , ele)
	//{
	//	document.write("第" + index + "个元素是:" + ele + "<br />");
	//}
	each([4, 20 , 3] , function(index , ele)
	{
		document.write("第" + index + "个元素是:" + ele + "<br />");
	});
</script>

通过上面的例子我们可以看出来

call的使用方法是

函数引用.call(调用者,参数1,参数2..);

和常规调用的对比就是

函数名.call(调用者,参数1,参数2..)=调用者.函数名(参数1,参数2..);

其三 用apply方法调用

第三种方法与第二种的区别在于

call必须写清楚每一个参数

apply可以直接传进去要给数组或者用arguments代替 

代码如下

<script type="text/javascript">
	// 定义一个函数
	var myfun = function(a , b)
	{
		alert("a的值是:" + a
			+ "\nb的值是:" + b);
	}
	// 以call()方法动态地调用函数
	myfun.call(window , 12 , 23);
	var example = function(num1 , num2)
	{
		// 直接用arguments代表调用example函数时传入的所有参数
		myfun.apply(this, arguments);
	}
	example(20 , 40);
	// 为apply()动态调用传入数组
	myfun.apply(window , [12 , 23]);
</script>

推荐资料

http://www.cnblogs.com/lhb25/archive/2009/03/12/1409241.html

谈谈javascript 中的函数问题的更多相关文章

  1. 谈谈javascript中的prototype与继承

    谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...

  2. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  3. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

  4. JavaScript中的函数表达式

    在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表 ...

  5. JavaScript中Eval()函数的作用

    这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...

  6. Javascript中call函数和apply函数的使用

    Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: so ...

  7. 【JavaScript】Javascript中的函数声明和函数表达式

    Javascript有很多有趣的用法,在Google Code Search里能找到不少,举一个例子: <script> ~function() { alert("hello, ...

  8. Javascript中的函数

    Javascript中的函数 1.什么是函数 函数是被命名的,独立的,完成特定功能的代码段.其可能给调用它的程序返回值,我们把这个代码段就称之为"函数". 被命名的:函数大部分都是 ...

  9. Javascript中的函数(Function)与对象(Object)的关系

    今天我们来尝试理解Function和Object.因为这个里面有些人前期可能会搞糊涂.他们之间到底是什么关系.当然也不除外当初的我. 注意:官方定义: 在Javascript中,每一个函数实际上都是一 ...

随机推荐

  1. C++后台实践:古老的CGI与Web开发

    本文写给C/C++程序猿,也适合其他对历史感兴趣的程序猿 ============================================= 谈到web开发,大家首先想到的PHP.JavaEE ...

  2. 开源一个自己造的轮子:基于图的任务流引擎GraphScheduleEngine

    GraphScheduleEngine是什么: GraphScheduleEngine是一个基于DAG图的任务流引擎,不同语言编写.运行于不同机器上的模块.程序,均可以通过订阅GraphSchedul ...

  3. 解读Batch Normalization

    原文转自:http://blog.csdn.net/shuzfan/article/details/50723877 本次所讲的内容为Batch Normalization,简称BN,来源于<B ...

  4. 给大家安利一个学习angular2的视频网站

    本文地址:http://blog.csdn.net/sushengmiyan 本文作者:苏生米沿 视频地址: https://egghead.io/courses/angular-2-fundamen ...

  5. 衣带渐宽终不悔,为伊消得人憔悴--DbHelper增强版

    核心理念 如何使用 测试实例 数据库内详细数据信息 测试代码 数据库连接池测试 测试集 延伸 相关下载链接 前几日,写了一篇关于一个 轻量级数据持久化的框架的博客(点击浏览: http://blog. ...

  6. WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码

    上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...

  7. EBS业务学习之库存管理

    库存管理业务流程 企业结构 库存结构 库存结构定义 指定每个子库存的特性: •子库存的数量跟踪 •资产类子库存 •保留子库存 •净值子库存 •包含在有效承诺中Include in ATP •子库存级库 ...

  8. activiti实战系列 并行网关(parallelGateWay)

    流程图 13.2:部署流程定义+启动流程实例 13.3:查询我的个人任务 13.4:完成我的个人任务 说明: 1) 一个流程中流程实例只有1个,执行对象有多个 2)  并行网关的功能是基于进入和外出的 ...

  9. actionbar详解(二)

    经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对较为深刻的理解了.唯一欠缺的是,前面我们都只是学习了理论知识而已,虽然知识点已经掌握了,但是真正投入到项目实战当中时会不会掉链子还很 ...

  10. Dynamics CRM 自定义上传附件的图片悬浮层显示

    CRM中的附件是以流的形式保存在了数据库中,这样做的一个坏处是一旦系统运行时间久,附件上传的多了势必会导致数据库极速扩大,即影响系统的运行效率也对后期的迁移维护带来了不必要的麻烦.所以很多的客户都会要 ...