《深入理解JavaScript》—— 函数
1.JavaScript中函数的3种形式
一旦你定义了一个函数,那么他就拥有了多种调用形式:
● 非方法调用(“普通函数”)
你可以直接调用函数,那么它会像一个普通函数一样运行。
add(‘hello’);
通常,函数的命名以小写字母开头。
● 构造器
你可以使用new操作符来调用一个函数。哲挥手函数将会是一个构造器,一个创建对象的工厂:
var a = new Date();
通常,函数作为构造器,其命名都是以大写字母开头。
● 方法
你可以讲一个函数储存为一个对象的属性,这时候他会变成一个方法,而你可以通过对象啦调用它。
obj.method();
按照惯例,方法的名称也是以小写字母开头。
(2) 术语:“形参”(parameter)和“实参”(arguments)
● 形参被用在定义函数时。其中param1和param2都是形参。
function foo( param1 , param2 ) { return param1 + param2; } foo();
其中实参是在函数调用时被使用。
foo( 2 , 3 );
(3) 定义函数
● 通过函数表达式
● 通过函数声明
● 通过Function()构造器
其中,所有函数都是Function构造器的实例。因此,函数从Function.prototype上继承了方法。
1. 函数表达式
函数表达式会产生一个值——函数对象。例如:
var add = function ( x , y ) { return x + y; }; console.log ( add(1,2) ); // 3
具名函数表达式:你可以给函数表达式起一个名字,具名函数表达式使得函数表达式可以引用它自身,这对递归很有用。
注:具名函数表达式的名字只能在函数表达式内部被访问到。
var repeat = function me( n , str ) { return n > 0 ? str + me(n-1,str) : ''; }; console.log ( repeat( 3 , 'hello' ) ); // hellohellohello console.log ( me ); // ReferenceError : me is not defined
2. 函数声明
函数声明看起来像是一个函数表达式,但其实它是一个语句。
3. Function构造器
var add = new Function ( 'x' , 'y' , 'return x + y' );
我: 只做了解就好,这种方法完全不建议使用。
(4) 函数提升
函数提升表示“将函数的声明放到作用域的开始”。函数声明是做了完全提升的,而变量声明则是部分提升。
(5) 函数的名称
大多数JavaScript引擎对于函数对象都会提供一个非标准的name属性。
函数的名称对于debug来说是非常有用的,所以有一些开发者会给函数表达式加上名字。
(6) 控制函数调用:call()、apply()、bind()
所有的函数(记住这里说的函数是指对象以及对象的方法)都具有call()、apply()、bind()方法。它们可以在执行方法时用一个值指向this,并改变面向对象的作用域。
1. func.apply(thisValue,argValue)
2. func.bind(thisValue,arg1,arg2...)
这个方法会执行部分的函数功能,它会创建一个新的函数,这个函数会调用func,并会将thisValue指定为this,同时应用以下参数,紧随其后的是新函数的实际参数。