谈谈javascript 中的函数问题
聊聊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 中的函数问题的更多相关文章
- 谈谈javascript中的prototype与继承
谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- 前端学习 第六弹: javascript中的函数与闭包
前端学习 第六弹: javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) { ...
- JavaScript中的函数表达式
在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表 ...
- JavaScript中Eval()函数的作用
这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...
- Javascript中call函数和apply函数的使用
Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: so ...
- 【JavaScript】Javascript中的函数声明和函数表达式
Javascript有很多有趣的用法,在Google Code Search里能找到不少,举一个例子: <script> ~function() { alert("hello, ...
- Javascript中的函数
Javascript中的函数 1.什么是函数 函数是被命名的,独立的,完成特定功能的代码段.其可能给调用它的程序返回值,我们把这个代码段就称之为"函数". 被命名的:函数大部分都是 ...
- Javascript中的函数(Function)与对象(Object)的关系
今天我们来尝试理解Function和Object.因为这个里面有些人前期可能会搞糊涂.他们之间到底是什么关系.当然也不除外当初的我. 注意:官方定义: 在Javascript中,每一个函数实际上都是一 ...
随机推荐
- Rails多路径调用相同方法原路返回的方法
有时候可能有多条path到达同一个method,此时,我们希望在该方法完成后自动转到之前进入的path中去,其实实现起来非常简单,只需要实现如下两个方法: def redirect_back_or(d ...
- 剑指Offer——知识点储备-常用算法
剑指Offer--知识点储备-常用算法 快速排序 注:若排序是有序的,采用快排,则退化为冒泡排序. 解决这个问题,采用两个选取基准的方法 (1)随机选取基数(在这个区间内随机取一个数) 出现的恶劣情况 ...
- Gazebo機器人仿真學習探索筆記(六)工具和实用程序
Gazebo附带了许多工具和实用程序. 这些教程说明了这些可用的工具,以及如何使用它们. 主要有: 1 记录和播放 2 日志过滤 3 应用力/扭矩 4 HDF5数据集 官网介绍通俗具体,非常容易,请参 ...
- Spark分布式计算和RDD模型研究
1背景介绍 现今分布式计算框架像MapReduce和Dryad都提供了高层次的原语,使用户不用操心任务分发和错误容忍,非常容易地编写出并行计算程序.然而这些框架都缺乏对分布式内存的抽象和支持,使其在某 ...
- XML之SAX解析模型
DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢 SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解 ...
- char能表示(-128~127)
char 的取值范围是 -128 ~127 注:数0的补码表示是唯一的: +0的补码=+0的反码=+0的原码=00000000 -0的补码=11111111+1=00000000(mod 2的8次方) ...
- C库源码中的移位函数
#include <stdio.h> /* _lrotr()将一个无符号长整形数左循环移位的函数 原形:unsigned long _lrotr(unsigned long value,i ...
- 1gitolite构建git服务器
软件环境:在有网络条件下(主要是为了安装软件),UbuntuKylin 14.04 1 安装openssh-serveropenssh-client,如果用的是VPS之类的一般都默认安装好了,不 ...
- 《java入门第一季》之HashSet小案例:获取10个1至20的随机数,要求随机数不能重复
这是基于HashSet集合的唯一性. /* * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复. * * 分析: * A:创建随机数对象 * B:创建一个HashSet集合 ...
- 如何在Cocos2D 1.0 中掩饰一个精灵(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 尝试编译运行,在你每一次点击屏幕的时候,你将看到我可爱的妻子制作 ...