《深入理解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,同时应用以下参数,紧随其后的是新函数的实际参数。

原文地址:https://www.cnblogs.com/luohaoran/p/5964697.html