深入理解javascript函数

函数实际上是对象,每个函数都是Function类型的实例,且与其他类型一样具有属性和方法.由于函数是对象,故函数名即为指向函数的指针,正是由于这一点,函数没有重载,重复定义函数只会后者替换前者.

函数的定义

函数的定义有三种:

  • 函数声明

function sum(num1,num2){
return num1+num2;
}
  • 函数表达式

var sum=function(sum1,sum2){return sum1+sum2;
}
  • 使用Function构造函数(不推荐使用)

var sum=new Function('num1','num2','return num1 + num2;');

注:函数声明和函数表达式的唯一区别是函数声明会提前.意即函数调用在函数声明之前可以正常运行.

作为值的函数

前面提到函数是对象,所以函数也可以作为参数值或返回值.

//作为参数
function callSomeFunction(someFunction,someArgument){
reuturn someFunction(someArgument);
}function add10(num){
return num+10;
}var result=callSomeFunction(add10,10);
alert(result); //20//作为返回值
function createCompareFunction(propertyName){return function(object1,object2){var value1 = object1[propertyName];var value2 = object2[propertyName];if(value1 < value2){return -1;}else if(value1 > value2){return 1;}else{return 0;}}
}

函数内部属性

在函数内部有两个特殊对象:arguments this
arguments是一个类数组对象,包含传入函数中的所有参数(这是其主要用途),除此之外,其还有一个callee的属性,该属性是一个指针,指向当前函数对象.
this引用的是函数据以执行的环境对象.在调用函数之前,this的值是不确定的,当在全局对象中调用函数时,this引用的是全局对象window,当把函数赋值给某对象时,this指的是此对象.

window.color = "red";
function sayColor(){
alert(color);
}
sayColor(); //redvar o={color:'blue'};
o.sayColor = sayColor;
o.sayColor();//blue

函数的属性和方法

  1. 属性
    length:函数希望接收的命名参数的个数.
    prototype:这是一个非常耐人寻味的属性,它保存着函数的实例方法,意即到通过函数实例化得到的对象可以访问prototype中的方法.此属性在自定义引用类型和实现继承很有用处.

  2. 方法
    apply call这两个方法是函数的非继承方法.用途都是设置函数体内this对象的值.

apply接收两个参数,第一个是运行函数的作用域,通俗的说就是将这个参数作为this指向的值.第二个参数是数组作为执行函数的参数.

function sum(num1,num2){
return num1+num2;
}
function callSum(num1,num2){
return sum.apply(this,arguments);
}
alert(callSum(10,10)); //20

call接收的第一个参数也是运行函数的作用域,后面的参数也是传递给执行函数的参数,与apply不同的是,后面的参数并非数组,而是逐个列举出来的.

function sum(sum1,sum2){
return sum1+sum2;
}
function callSum(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum(10,10)); //20

构造函数

ECMAScript中的构造函数可以创建特定类型的对象.内置的构造函数(例如Array Object)会自动出现在执行环境中.构造函数的首字母应该以大写字母开头,从而区分非构造函数.
要创建新的实例,必须使用new操作符,穿件新的实例会经历以下四个步骤:

  1. 创建一个新对象

  2. 将构造函数的作用域赋值给新对象(因此this指向这个新对象);

  3. 指向构造函数中的代码.

  4. 返回新对象

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}var person=new Person('Mr pu',24,'web developer');

构造函数与普通函数的区别在于构造函数在实例化时加了new关键字.其它地方完全一样.

重要提示 在通过构造函数实例化对象时,请勿把方法放在构造函数中,因为每个函数(在这里指方法方法)都是对象,每次实例化一个对象时这个对象中会保存每一构造函数中的方法,这是很影响性能的.解决办法是把这些方法放在prototype属性中.

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

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

相关文章

在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务

在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务https://procodeguide.com/programming/polly-in-aspnet-core/在本文中&#xff0c;我们将了解如何在微服务中实现弹性容错&#xff0c;即在 ASP.NET Core 中使用 Polly 构建弹性微服务&#xff08;Web API&#xff0…

Android开发者指南(29) —— USB Host and Accessory

前言 本章内容为Android开发者指南的 USB章节&#xff0c;译为"USB主从设备"&#xff0c;版本为Android 4.0 r1&#xff0c;翻译来自&#xff1a;"太阳火神的美丽人生"&#xff0c;欢迎访问他的博客&#xff1a;"http://alot.sinaapp.com"&#…

知乎超高赞:都有哪些习惯值得长期坚持?

全世界只有3.14 % 的人关注了爆炸吧知识知乎上有个高赞问题&#xff1a;有哪些值得长期坚持下去就能改变人生的好习惯&#xff1f;其中最高频的回答是读书。随着经历和阅历的增加&#xff0c;越来越多的人清醒的认识到&#xff1a;读书不再是学生时代的事&#xff0c;而是一生的…

mysql 免费前端_MySQL

MySQL这是一个关系型数据库&#xff0c;存在表的概念。结构数据库可以存放多张表&#xff0c;每个表可以存放多个字段&#xff0c;每个字段可以存放多个记录。DOS命令操作数据库PHPstudy使用终端打开数据库第一步&#xff1a;设置-->MySQL工具-->MySQL命令行&#xff1b;…

惊了!日本街头出现透明公厕,竟有人排队抢着上!

全世界只有3.14 % 的人关注了爆炸吧知识最近在日本一个公园内&#xff0c;一间透明的厕所火了&#xff01;厕所为什么是透明的&#xff1f;如何保证私密性&#xff1f;还是一个装置艺术&#xff0c;在哗众取宠&#xff1f;相信你跟我有一样的疑问。其实啊&#xff0c;这是日本财…

Gitflow branch与Docker image tag命名冲突怎么办?

谷歌还是比必应要好用一点。在前公司&#xff0c;我根据主流的git flow 给团队搭建了一套devops流程&#xff0c;运行在 docker & k8s上。在现代devops流程中&#xff0c;一般推荐使用git分支名或者git tag作为镜像的tag名。在实际操作中&#xff0c; 我遇到了一个流程阻塞…

ubuntu 安装 php

按照 Unofficial Ubuntu 6.06 (Dapper Drake) Linux Starter Guide的步骤来 一、安装Apache2 sudo apt-get install apache2 然后在Firefox中打开: http://localhost/ 提示成功 安装完毕后&#xff0c;接下来就要启动Apache了 如果只是用于本地开发&#xff0c;加强安全性&…

测试你的Python 水平----6

为什么80%的码农都做不了架构师&#xff1f;>>> 1、问&#xff1a;简述python中unicode和utf-8的关系&#xff1f;常用的函数有哪些&#xff1f;答&#xff1a;unicode是一个字符编码集合&#xff0c;定义每个字符的唯一编码&#xff1b;utf-8则是unicode的一种实现…

970页绝版资料!初高中数学与竞赛知识点+方法技巧,由苏步青当顾问,众多一线名师共同编写!...

全世界只有3.14 % 的人关注了爆炸吧知如何才能学好数学&#xff1f;我国著名数学家苏步青先生曾说&#xff1a;"要学好数学&#xff0c;方法不外乎打好基础&#xff0c;多做习题&#xff0c;多加思索和分析”。为了帮助大家学好数学&#xff0c;今天&#xff0c;超模君要给…

使用WTMPlus快速搭建发卡网

快点关注我们吧作者介绍不倔强的草莓&#xff0c;从事互联网乞讨行业多年&#xff0c;深入了解乞讨业务。开发过草莓要饭网等系统。对互联网乞讨的运营有一定经验。什么是WTM框架&#xff1f;WTM框架是一款.NET平台下的开源快速开发框架,可以快速、灵活、高效的开发一个基于.NE…

mysql老叶博客_MySQL binlog后面的编号最大是多大?【老叶茶馆公众号】

MySQL binlog后面的编号最大是多大&#xff1f;具体文章请关注微信公众号&#xff1a;izhishuedu 【知数堂】 知数堂版权所有。这里我就不啰嗦了&#xff0c;直接上贴代码&#xff1a;版本&#xff1a;5.7.18mysql-5.7.18/sql/binlog.cc 大约在3310行开始&#xff1a;MAX_LOG_…

如何优雅的当海王……

1 这车怪有个性的▼2 这个胡律师要火啊▼3 被拦下的教师节礼物……▼4 老公”偷情“的证据▼5 这船快得很&#xff0c;沉得快▼6 别耽误孩子&#xff0c;让孩子去跑马拉松吧▼7 这是要电脑养蛊&#xff1f;▼你点的每个赞&#xff0c;我都认真当成了喜欢

Linux Command Line 解析

处理模型 Linux kernel 的启动包括很多组件的初始化和相关配置&#xff0c;这些配置参数一般是通过command line 进行配置的。在进行后续分析之前&#xff0c;先来理解一下command line 的处理模型&#xff1a; 要处理的对象是一个字符串&#xff0c;其中包含了各种配置信息&am…

COSCon'21 参会指南 你想要的这里都有

“ 点击蓝字 / 关注我们 ”| 作者&#xff1a;袁睿斌| 编辑&#xff1a;Corrie| 设计&#xff1a;宋传琪开源社寄语2021年的10月&#xff0c;第六届中国开源年会&#xff08;COSCon21&#xff09;再一次如期召开了。今年的开源寄语&#xff0c;我们能够想到是三个关键词&#x…

为什么说减速带是脑残的设计?

全世界只有3.14 % 的人关注了爆炸吧知识开车的谁没有压过减速带啊&#xff0c;当你以较高车速通过它时&#xff0c;剧烈振动会带给你强烈的刺激&#xff0c;有时候胃都感觉不舒服&#xff0c;加强你的不安全疑虑&#xff0c;促使你减速行驶。简单来说&#xff0c;就是“顶你起来…

C++语言基本概念(5)

面向对象编程与面向过程的一个根本区别&#xff0c;就是面向对象编程在虚拟的计算机世界构造出了形形的对象&#xff0c;很显然这些对象之间必然要发生关系&#xff0c;如何区别描述这些关系也是面向对象这门课所要研究的问题。我们都知道其中有非常多的概念&#xff0c;有些概…

创建工程师文化的3个步骤 | IDCF

原文地址&#xff1a;https://dzone.com/articles/3-steps-to-create-an-engineering-culture作者博文地址&#xff1a;https://start2grow.net/?screateagreatengineeringculture作者&#xff1a;Linda Bovaird译者&#xff1a;冬哥在之前的文章&#xff08;https://start2gr…

UIButton的竖排图片和文本

UIButton的竖排图片和文本UIButton的竖排图片和文本第一想法:实现思路第二种方法UIContentHorizontalAlignment/UIControlContentVerticalAlignment完整代码片段:参考资料:更新UIButton的竖排图片和文本UIButton的竖排的话,如果不知道方法,就会走很多弯路了第一想法:实现思路橙…

他是绝世天才,却只开了半辈子的挂!死后惨遭封号200年,这就是和牛顿抬杠的下场.........

全世界只有3.14 % 的人关注了爆炸吧知识既生胡何生顿1703年3月3日&#xff0c;68岁的“英国达芬奇”躺在病床上&#xff0c;奄奄一息。临终前&#xff0c;他仍在惦记一个事儿&#xff1a;他希望&#xff0c;当年砸牛顿头上的&#xff0c;是个榴莲。因为是牛顿&#xff0c;让终身…

使用LightBDD轻松实现行为驱动开发

前言上次&#xff0c;我们介绍了行为驱动开发&#xff08;BDD&#xff09;它的优点是可以使用纯文本编写测试用例&#xff0c;不需要编程经验。如果测试用例也全部是程序员写的情况&#xff0c;这种方式反而存在障碍&#xff0c;feature使用与编写代码的语言完全不同的语言来编…