今天谈谈函数的基本概念,其实数学中的函数和编程中的函数相当类似,但个人认为在编程中的函数更为复杂。
![](https://img.haomeiwen.com/i8661291/c49a296ac83240cb.png)
定义
JavaScript中的函数是一种原型链中有函数原型(Function-prototype)的一种对象。
声明函数的方式
- 具名函数:
function x(arguments){函数体}
- x为函数名,函数名称可以任意取
- arguments是参数
- 函数体中必定会有return,假如没有浏览器自动加上
- 匿名函数:
var x = function(arguments){函数体}
- 匿名函数必须有变量容器,因为本身并没有函数名称,如果不使用变量包裹,则无法引用,也会被浏览器当做垃圾回收。
- arguments是参数
- 函数体中必定会有return,假如没有浏览器自动加上
var x = function y(arguments){函数体}
- 此时函数的名称y只能在函数内部引用
- arguments是参数
- 函数体中必定会有return,假如没有浏览器自动加上
- window.Function(全局对象声明):
new Function('x','y','return x+y')
- new是可以省略的
- 参数为x,y,并且还可以增加
- 箭头函数:
f = (arguments)=> {return 表达式}
函数中的return
函数必须有返回值,而返回值是用return表示起始,返回的值是由return的下一句代码确定,而之后的代码则不再运行。假如不写,系统默认返回值是undefined。
如何调用函数
生成函数之后可以有两种写法调用函数
函数名/变量()
函数名/变量.call(undefined,arguments)
立即调用函数(IIFE)
有时候必须在声明函数的时候就调用函数,那么写法如下:
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();
使用立即调用函数的时候,最后的分号最好加上。
函数的name属性
具名函数name就是其函数名
匿名函数的name就是其变量名称
第三种声明方式下的函数name是函数名
全局对象情况下,函数name是‘anonymous’
函数的length属性
函数的length属性的值只和声明时有关,只等于声明时函数参数个数。
函数的基本用法就这些,现在来谈谈函数更深入的使用
函数的toString属性
.toString
是函数原型(Function.prototype)上的一个key,其属性会覆盖对象原型(Object.prototype)上的tostring属性,而函数原型中,这个属性的value是函数体的源码,用字符串形式储存。
调用函数和toString的关系
调用时会执行这段源码,用的是eval()
的命令执行之。
function和var的相似之处
相同:
- function和var都是关键字
- function和var的声明都会提升到代码的最前面
不同之处:
- function只能声明函数,var只可以声明变量
函数的作用域
函数的作用域只和初始声明时函数作用域相关,与调用函数时函数所处的位置无关
var a = 1;
var x = function () {
console.log(a);
};
function f() {
var a = 2;
x();
}
f() // 1
函数内部变量也是局部提升的
闭包:如果一个函数使用了他作用域之外的变量,那么(这个函数和这个变量)就叫做闭包。
var n = 999;
function f1() {
console.log(n);
}
f1() // 999
网友评论