全栈工程师开发手册 (作者:栾鹏)

js系列教程4-函数、函数参数

在js中,函数本身属于对象的一种,因此可以定义、赋值,作为对象的属性或者成为其他函数的参数。函数名只是函数这个对象类的引用。

一、函数定义

【1】函数声明语句
使用function关键字,后跟一组参数以及函数体

function funcname([arg1 [,arg2 [...,argn]]]){statement;
}

【2】函数定义表达式

以表达式方式定义的函数,函数的名称是可选的

var functionName = function([arg1 [,arg2 [...,argn]]]){statement;
}var functionName = function funcName([arg1 [,arg2 [...,argn]]]){statement;
}

匿名函数(anonymous function)也叫拉姆达函数,是function关键字后面没有标识符的函数

通常而言,以表达式方式定义函数时都不需要名称,这会让定义它们的代码更加紧凑。函数定义表达式特别适合用来定义那些只会使用一次的函数

var tensquared = (function(x) {return x*x;}(10));   //

而一个函数定义表达式包含名称,函数的局部作用域将会包含一个绑定到函数对象的名称。实际上,函数的名称将成为函数内部的一个局部变量

var test = function fn(){return fn;
}
console.log(test);//fn(){return fn;}
console.log(test());//fn(){return fn;}
console.log(test()());//fn(){return fn;}

个人理解,对于具名的函数表达式来说,函数名称相当于函数对象的形参,只能在函数内部使用;而变量名称相当于函数对象的实参,在函数内部和函数外部都可以使用

var test = function fn(){return fn === test;
}
console.log(test());//true
console.log(test === fn);//ReferenceError: fn is not defined

函数定义了一个非标准的name属性,通过这个属性可以访问到给定函数指定的名字,这个属性的值永远等于跟在function关键字后面的标识符,匿名函数的name属性为空

//IE11-浏览器无效,均输出undefined
//chrome在处理匿名函数的name属性时有问题,会显示函数表达式的名字
function fn(){};
console.log(fn.name);//'fn'
var fn = function(){};
console.log(fn.name);//'',在chrome浏览器中会显示'fn'
var fn = function abc(){};
console.log(fn.name);//'abc'

【3】Function构造函数

Function构造函数接收任意数量的参数,但最后一个参数始终都被看成是函数体,而前面的参数则枚举出了新函数的参数

var functionName = new Function(['arg1' [,'arg2' [...,'argn']]],'statement;');

[注意]Function构造函数无法指定函数名称,它创建的是一个匿名函数

从技术上讲,这是一个函数表达式。但,不推荐使用,因为这种语法会导致解析两次代码。第一次是解析常规javascript代码,第二次解析传入构造函数中的字符串,影响性能

var sum = new Function('num1','num2','return num1 + num2');
//等价于
var sum = function(num1,num2){return num1+num2;
}

Function()构造函数创建的函数,其函数体的编译总是会在全局作用域中执行。于是,Function()构造函数类似于在全局作用域中执行的eval()

var test = 0;
function fn(){var test = 1;return new Function('return test');
}
console.log(fn()());//0

[注意]并不是所有的函数都可以成为构造函数

var o = new Math.min();//Uncaught TypeError: Math.min is not a constructor

二、函数声明顺序

函数声明,相对于变量会优先加载。所以不用担心函数声明在调用前还是调用后。

调用函数时会先在本机活动对象中查询,即当前js文件中查询,如果没有才会向上查询,所以若在两个js文件中定义相同函数名,这两个js文件内部调用各自的函数,其他js文件中调用最后声明的函数。

三、重复

变量的重复声明是无用的,不会覆盖之前同一作用域声明的变量,但函数的重复声明会覆盖前面的声明的同名函数或同名变量。

//变量的重复声明无用
var a = 1;
var a;
console.log(a);//1
//覆盖同名变量
var a;
function a(){console.log(1);
}
a();//1
//覆盖同名函数
a();//2
function a(){console.log(1);
}
function a(){console.log(2);
}

四、删除

函数声明语句创建的变量无法删除,这一点和变量声明一样。

function foo(){console.log(1);
}
delete foo;//false
console.log(foo());//1

js中函数的三种定义方式、函数声明、函数同名重复、函数删除、相关推荐

  1. java定义数组_java中数组的三种定义方式_java中数组的定义及使用方法(推荐)...

    java中数组的三种定义方式 java中,数组是一种很常用的工具,今天我们来说说数组怎么定义 [java] view plain copy /** * 数组的三种定义方法 * 1.数组类型[] 数组名 ...

  2. 函数指针三种定义与使用方式

    文章目录 函数类型剖析 通过什么来区分两个不同的函数? 函数指针(指向函数的指针) 函数指针三种定义方式 函数指针和指针函数的区别: 代码案例 函数类型剖析 通过什么来区分两个不同的函数? 一个函数在 ...

  3. JavaScript中函数的三种定义方法

    JavaScript中函数定义的三种方法. 函数的三种定义方法分别是:函数定义语句.函数直接量表达式和Function()构造函数的方法.下面依次介绍这几种方法具体怎么实现. 1. 函数定义语句 // ...

  4. c语言函数的三种调用方式是什么?

    函数的三种调用方式:1.函数作为表达式中的一项出现在表达式中,例"z=max(x,y)":2.函数作为一个单独的语句,例"printf("%d",a) ...

  5. c语言函数三种方式,c语言函数的三种调用方式是什么

    函数的三种调用方式:1.函数作为表达式中的一项出现在表达式中,例"z=max(x,y)":2.函数作为一个单独的语句,例"printf("%d",a) ...

  6. C语言中字符串的两种定义方式

    我们知道C语言中是没有字符串这种数据类型的,我们只能依靠数组进行存储,即字符数组,而我们定义并且初始化数组有两种方式.下面将给大家介绍这两种方式并且介绍这两种方式的区别: 方式1 前两种是正确的定义方 ...

  7. 【温故知新】——原生js中常用的四种循环方式

    一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出"欢迎下次光临" 在网页中弹出框输入1   网页输 ...

  8. js中数组的几种循环方式

    js中数组的几种循环方式 for循环最基本的循环方式,不多说.这种最基本的循环才是速度最快的,效率最高的. for(var i = 0;i<5;i++){console.log(i) } for ...

  9. node.js Next框架的三种渲染方式:客户端渲染、SSG、SSR

    前言 next是一款用JS开发的全栈框架,它是基于express框架基础上开发而成,可以用react写客户端,node.js写服务端.一份代码可在前后端同时运行,这在next中称之为同构! 一些nex ...

最新文章

  1. Android 使用 setImageResource 清空图片
  2. Linux目录规范和含义(转)
  3. 密码技术--非对称加密算法及Go语言应用
  4. 数据之“星”再燃,第二届「星斗奖」申报正式启动!
  5. C文件操作之写入字符串到指定文件并在屏幕显示
  6. Java核心篇之JVM--day3
  7. Bootstrap3 表格样式
  8. 【poj 2891】Strange Way to Express Integers(数论--拓展欧几里德 求解同余方程组 模版题)...
  9. [转载] Python——函数练习(包括简单递归)
  10. linux 不识别ar9380,用Linux做wifi熱點/無線路由
  11. [Java反序列化]AspectJWeaver反序列化
  12. 为什么未平仓量指标很重要?因为机构投资者要来“赶牛”了!
  13. objectbox No value passed for parameter ‘order‘
  14. 服务器系统修复工具,Windows Repair(系统修复工具) v4.9.0
  15. 数据采集之全埋点数据采集分析方法的一些整理
  16. 毕业设计 单片机智能录音器设计与实现 - 物联网 嵌入式
  17. 对finalize的理解
  18. 计算机达人成长之路目录
  19. 小学四年级计算机学会使用颜色,四年级信息技术《漂亮文字我来变》教案
  20. 学会思考技术背后的那些思想和本质

热门文章

  1. 语音识别看似神通广大 但它真的听得懂方言么
  2. 计算机软著研究生毕业,关于研究生推免工作科研成果和竞赛计分详细说明
  3. java自定义窗口_Java-创建一个自定义窗口,扁平化界面
  4. Element UI 重置表单功能
  5. layUI数据表格(table)
  6. 一个完整的软件项目开发流程,软件过程,软件生命周期
  7. 油猴脚本Tampermonkey初体验
  8. 计算C(n,0)+C(n,1)+...+C(n,m)--Problem B. Harvest of Apples
  9. spark的python开发安装方式,最简单的方式来安装Python依赖关系的Spark执行器节点?...
  10. Mandelbrot vs Julia