JavaScript学习随记——Function

       每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会于某个函数绑定。


函数的定义方式

<script type="text/javascript" charset="utf-8">/*** 	每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。* 由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会于某个函数绑定。* 函数通常是使用函数声明语法定义的,如下面的列子所示:*//*** @example 1:函数声明式定义函数* * * @param {Object} num1* @param {Object} num2*/function sum(num1,num2){return num1+num2;}/*** @example 2: 函数表达式式定义函数* * @param {Object} num1* @param {Object} num2* @note: 代码声明了一个sum变量并将其初始化为一个函数*/var sum = function(num1,num2){return num1+num2;				};/*** @example 3:Function构造函数定义函数(不推荐使用)* * @syntax : var functionName = Function("参数1","参数2","参数3",...,"函数体");* @note:Function构造函数中最后一个参数是函数构造的函数体,其他的参数是函数构造的参数。* 		从技术角度讲,这是一个函数表达式。但是,我们不推荐使用这种方法定义函数,因为这种语法会导致解析两次代码* (第一次是解析常规ECMAScript代码,第二次是解析传入函数中的字符串),从而影响性能。不过,这种语法对于理解* "函数是对象,函数名是指针"的概念是很非常直观的。*/var sum = Function("num1","num2","return num1+num2;");
</script>


函数定义方式效率比较

<script type="text/javascript" charset="utf-8">//函数表达式式定义函数var start = Date.now();for(var i=0;i<10000;i++){var sum = function(num1,num2){return num1 + num2;};}var stop = Date.now();console.log("(10000次) 函数表达式式定义函数,总耗时: "+(stop-start));var start = Date.now();for(var i=0;i<100000;i++){var sum = function(num1,num2){return num1+num2;				};}var stop = Date.now();console.log("(100000次)函数表达式式定义函数,总耗时: "+(stop-start));//函数声明式定义函数var start = Date.now();for(var i=0;i<10000;i++){function sum(num1,num2){return num1+num2;}}var stop = Date.now();console.log("(10000次) 函数声明式定义函数,总耗时: "+(stop-start));var start = Date.now();for(var i=0;i<100000;i++){function sum(num1,num2){return num1+num2;}}var stop = Date.now();console.log("(100000次)函数声明式定义函数,总耗时: "+(stop-start));//Function构造函数定义函数var start = Date.now();for(var i=0;i<100;i++){var sum = Function("num1","num2","return num1+num2;");}var stop = Date.now();console.log("(100次) Function构造函数定义函数,总耗时: "+(stop-start));var start = Date.now();for(var i=0;i<1000;i++){var sum = Function("num1","num2","return num1+num2;");}var stop = Date.now();console.log("(1000次)Function构造函数定义函数,总耗时: "+(stop-start));/********************* 【开始】运行结果 ********************(10000次) 函数表达式式定义函数,总耗时: 6(100000次)函数表达式式定义函数,总耗时: 47(10000次) 函数声明式定义函数,总耗时: 12(100000次)函数声明式定义函数,总耗时: 113(100次) Function构造函数定义函数,总耗时: 611(1000次)Function构造函数定义函数,总耗时: 5095********************* 【结束】运行结果 ********************/
</script>


不同定义方式的函数解析执行顺序

<script type="text/javascript" charset="utf-8">/*** 解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。* 解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);* 至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析器执行。* * 例子如下:* 例子分析:受执行顺序的影响,(函数是对象,函数名是指针)getName被后执行的表达式式定义的函数覆盖*/var getName = function(){return "李四";};console.log(getName());function getName(){return "张三";}console.log(getName());/********************* 【开始】运行结果 ********************李四李四********************* 【结束】运行结果 ********************/	
</script>

函数共有的属性和方法

      属性:
              1、length:值为函数希望接受的参数的个数;
              2、caller:保存着调用当前函数的函数的引用;
              3、prototype:每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。在ECMAScript 5 中,prototype 属性是不可枚举的。
      方法:
              1、apply(socpe,argyArray):在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
                  第一个参数(scope)表示运行函数的作用域,第二个参数是一个Array实例,也可以是arguments对象(函数调用时的参数)。
              2、call(scope,arg1,arg2,arg3....):在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
                  第一个参数(scope)表示运行函数的作用域,后面的参数都是函数调用时的参数。

<script type="text/javascript" charset="utf-8">/*** arguments 它是一个类似数组对象,包含着传入函数中的所有参数。*/function sum(){var total = 0;for(var i=0;i<arguments.length;i++){total+=arguments[i];}return total;}console.log("sum(1): "+sum(1));console.log("sum(1,2): "+sum(1,2));console.log("sum(1,2,3): "+sum(1,2,3));console.log("sum(1,2,3,4): "+sum(1,2,3,4));/********************* 【开始】运行结果 ********************sum(1): 1sum(1,2): 3sum(1,2,3): 6sum(1,2,3,4): 10********************* 【结束】运行结果 ********************/	
</script>

<script type="text/javascript" charset="utf-8">/*** 定义阶乘函数* @param {Object} num* * @note: 下面定义阶乘的函数例子中,函数名字与函数执行体存在紧密的耦合* 在一起,因此想用其他的函数名时则需要修改函数体代码。JavaScript提供* 了一种方式消除这种紧密耦合现象,就是使用 arguments.callee*/function factorial(num){if(num <= 1){return 1;}else{return num*factorial(num-1);}}console.log("factorial(5): "+factorial(5));/*** 定义阶乘函数(函数名与代码体无耦合关系)* arguments.callee: arguments的属性,保存着arguments的所属函数的引用,即 arguments.callee 等价于 arguments对象所属函数。* @param {Object} num*/function factorial1(num){if(num <= 1){return 1;}else{return num * arguments.callee(num-1);}}console.log("factorial1(5): "+factorial1(5));/********************* 【开始】运行结果 ********************factorial(5): 120factorial1(5): 120********************* 【结束】运行结果 ********************/	
</script>

<script type="text/javascript" charset="utf-8">/*** function 中this指向的是函数的调用者,即谁调用了函数this就代表谁;*/window.name = "我乃是window";var zhangsan = {name:"我乃是张三"};var lisi = {name:"我是李四"};function getName(){return this.name;}console.log(getName.call(this));console.log(getName.call(window));console.log(getName.call(zhangsan));console.log(getName.call(lisi));/********************* 【开始】运行结果 ********************我乃是window我乃是window我乃是张三我是李四********************* 【结束】运行结果 ********************/	
</script>





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

登录id 黑苹果_黑苹果MacOSCatalina无法登录AppStore修复

先上图&#xff1a;惨红色的提示信息&#xff0c;把你拒之App Store门外&#xff0c;但是对之放弃、不与之斗争不是我们的节奏&#xff0c;请看破敌攻略&#xff1a;1.查看你的“关于本机”-->“概览”-->“系统报告”&#xff0c;如图&#xff1a;找到你的“网络”-->…

我们三十以后才明白

当我们懂得珍惜时光的时候,已经发现自己不再年轻. 三十岁,才慢慢的明白. 男女三十而立&#xff0c;三十岁应该是人生的转折点&#xff0c;它不是青春韶华的终结&#xff0c;而是生命的第二起跑线。 三十岁&#xff0c;面对的不应该是没落&#xff0c;而是认知的新起点。很多曾…

Web开发的入门指导

Web开发的入门指导web开发编程技术你点开此文&#xff0c;说明你对Web开发是有兴趣的&#xff0c;或者你正在思考开始学习Web开发。在这里&#xff0c;我会告诉你成为一名Web开发者的路线&#xff0c;是对初学者关于Web开发的指导。这篇文章不会教你如何写代码&#xff0c;而是…

新东方mti百科知识pdf_20南航翻硕mti初试417上岸经验贴

南京航空航天大学mti初试417分排名第一:‌基础英语88:1&#xff0c;外刊阅读:从2月到6月开始一直打卡外刊app&#xff0c;友邻优课&#xff0c;流利阅读等2&#xff0c;背单词:扇贝单词app&#xff0c;新东方专八单词绿皮书&#xff0c;华研专八单词等3&#xff0c;星火专八阅读…

JavaScript学习随记——属性类型

<!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>属性类型</title></head> <body><script type"text/javascript" charset"…

Shell if else语句

if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句&#xff1a; if ... fi 语句&#xff1b;if ... else ... fi 语句&#xff1b;if ... elif ... else ... fi 语句。1) if ... else 语句 if ... else 语句的语法&#xff1a; if [ ex…

过滤日志中不相关的堆栈跟踪行

我喜欢堆栈痕迹。 不是因为我喜欢错误&#xff0c;而是因为发生错误的那一刻&#xff0c;堆栈跟踪是无价的信息源。 例如&#xff0c;在Web应用程序中&#xff0c;堆栈跟踪向您显示完整的请求处理路径&#xff0c;从HTTP套接字到过滤器&#xff0c;Servlet&#xff0c;控制器&a…

Can't create/write to file '/tmp/#sql_887d_0.MYD' (Errcode: 17)

lsof |grep "#sql_887d_0.MYD" 如果没有被占用就可以删掉 。 https://wordpress.org/support/topic/cant-createwrite-to-file-error Hello, just today I saw this kind of error on every page on my blog. WordPress database error: [Cant create/write to file …

python3怎么创建文件_Python3.5 创建文件的简单实例

实例如下所示&#xff1a;#codingutf-8Created on 2012-5-29author: xiaochouimport osimport timedef nsfile(s):The number of new expected documents#判断文件夹是否存在&#xff0c;如果不存在则创建b os.path.exists("E:\\testFile\\")if b:print("File …

Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

上周我们介绍了神奇的只有五行的 Floyd 最短路算法&#xff0c;它可以方便的求得任意两点的最短路径&#xff0c;这称为“多源最短路”。本周来来介绍指定一个点&#xff08;源点&#xff09;到其余各个顶点的最短路径&#xff0c;也叫做“单源最短路径”。例如求下图中的 1 号…

JavaScript学习随记——错误类型

错误类型&#xff1a; 执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型&#xff0c;而当错误发生时&#xff0c;就会抛出相应类型的错误对象。 ECMA-262定义的7种错误类型 Error&#xff1a; 是错误的基类型&#xff0c;其他错误类型都继承该类型。Error…

多个集合中的共同和独特元素

本周&#xff0c;我们将暂时中断较高级别的问题和技术文章&#xff0c;以解决我们中许多人可能面临的一些代码问题。 没什么花哨的或太辛苦的&#xff0c;但是有一天它可能会节省您15分钟的时间&#xff0c;偶尔回到基础上也很不错。 因此&#xff0c;让我们开始吧。 有时&…

2016给自己一个交代

一、前言 在关于技术上的学习&#xff0c;常常有这样那样的计划&#xff0c;而最终一个都没有真正的落实。零散的学习&#xff0c;终究需要系统总结&#xff0c;才能使自己有所沉淀。从毕业至今&#xff0c;我一直在忙碌&#xff0c;为公司付出自己的很多很多&#xff0c;却只不…

洛克人红色思考型机器人叫什么_稻船敬二新企划《红色灰烬》 依然是机器人风格...

稻船敬二离开CAPCOM之后玩家们纷纷感叹《洛克人》系列将再无续作&#xff0c;不过在单飞的这段时间里&#xff0c;稻船敬二还是创作了诸如《苍蓝雷霆 刚巴尔特》《Mighty No.9》等类似洛克人风格的作品。其名下的团队comcept的最新作《Mighty No.9》即将于9月18日发售&#xff…

常见对话框

(1)普通对话框 // 点击按钮 弹出一个普通对话框public void click1(View v) {// 构建AlertDialogAlertDialog.Builder builder new Builder(this);builder.setTitle("警告");builder.setMessage("世界上最遥远的距离是没有网络");builder.setPositiveButt…

JavaScript学习随记——面向对象编程(继承)

Example:基于原型链的继承 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>面向对象编程&#xff08;OOP&#xff09;</title></head> <body>…

NSCharacterSet

先上个例子&#xff1a; NSString * str1 [nameInput.textstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]]; NSString * str2 [passwdInput.textstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]]; […

Apache Mahout:构建垃圾邮件过滤器服务器

Lucene发生了一些相当有趣的事情。 它最初是作为一个库&#xff0c;然后其开发人员开始基于它添加新项目。 他们开发了另一个开源项目&#xff0c;该项目将向Lucene添加爬网功能&#xff08;以及其他功能&#xff09;。 Nutch实际上是任何人都可以使用或修改的功能齐全的Web Se…

建模步骤_古建设计 | sketchup建模步骤教程(简易入门版)

前言本篇教程主要是针对古建建模入门者。小N给大家分享一套我相对简易的建模步骤。(PS&#xff1a;但是估计有些人可能会感觉我做的东西已经繁琐了……)因为主要是为了让大家熟悉、入门和好记忆。所以讲的东西&#xff0c;小N我会相对简单&#xff0c;有些细节的内容不会更多展…

JavaScript模块化

JavaScript模块化的实现方式&#xff1a; <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>模块化</title></head> <body><script type&quo…