函数是一种特殊的类,它的特性可以大概分为三类:
方法特性(): 运行大括号包裹的代码;
对象特性: 执行如f.bind()、f.call()之类的方法;
类的特性new: 可以做为构造函数。
方法特性就是执行大括号里的代码,这个比较简单,就不写了,如:
function f() {
// 运行这里面的代码
var x = 0;
return ++x;
}
接下来我们看对象特性: 对象特性又可以分为自有属性和自定义属性。
自有属性主要有:
arguments、length、call方法、apply方法、bind方法、name、prototype、toString()等。
自定义i属性主要有:
内部和外部的变量及方法的区别。
自有属性简单描述:再其他文章中会详细记录,现在只是描述。
arguments是接收实参返回一个数组,下图中返回null,是因为它存在,但没有内容,比如x,它不存在,所有返回undefined;
length是形参的个数;
name是返回函数的名称;
toString()是返回函数的字符串形式;
自定义属性: 内外部个有优缺点。
方法:
function f(a, b) {
f.x = 1;
}
f.y = 2;
f.x和f.y有什么区别?
f.x需要执行一下f()函数,才能访问到;而f.y可以直接访问。
这种自定义属性有何用?比如你在函数中再写一个函数,很难执行,可以写成匿名函数,再赋值给自定义属性,这样就方便访问。如:
function f(a, b) {
console.log("访问到了f()函数")
function e() {
console.log('访问我...,要带礼品。')
}
}
function f(a, b) {
console.log("访问到了f()函数")
f.e = function() {
console.log('访问我...,要带礼品。')
}
}
变量:
变量定义在内部会重新初始化,定义在外部又会被其他函数修改。根据实际业务使用。
var b = 0
function f() {
var a = 0;
a++;
b++;
console.log(`a=${a} | b=${b}`)
}
for(var i = 0; i < 10; i++) {
f();
}
也可以使用自定义属性中的这种方法写闭包(在其他文章中会写到),如:
f.a放外面也行,只是放里面好看些。
var b = 0
function f() {
if(f.a == undefined) {
console.log('f.a初始化')
f.a = 0
}
f.a++;
b++;
console.log(`a=${f.a} | b=${b}`)
}
for(var i = 0; i < 10; i++) {
f();
}