1.javascript是一门函数式语言,在javascript中,函数式第一形对象,也就是说,函数是可以共处的。它可以被引用,或声明称对象字面量,甚至可以作为参数进行传递。在JavaScript中,函数拥有对象的所有功能。
JavaScript函数是通过函数字面量进行声明从而创建函数值的。
函数字面量由四个部分组成
1.function关键字
2.可选名称,如果指定名称,名称必须为有效的JavaScript标识符。若不指定名称,则为匿名函数。如果一个函数不需要名称就能调用,则不需要为它命名。
3.括号内部,以逗号为分隔的参数列表。
4.函数体 ,包括在大括号内的一系列JavaScript语句。
所有函数都拥有name属性,匿名函数的name值为空字符串。
具名函数的声明有两种方式:
1. 函数声明式 2. 函数字面量式
//函数声明式 function bar () {} //函数字面量式 var foo = function () {}
在JavaScript中,作用域是由function进行声明的,而不是代码块。声明的作用域创建于代码块,但是不终结于代码块,这是JavaScript不同于其他面向对象语言的特征之一。例如:
if(text){ var x=321; } alert(x);
在譬如java的其他语言中,我们希望x终结于if语句的关闭大括号,alert会弹出一个undefined值。但是在JavaScript中,运行上述代码,我们会弹出321。这是因为,在JavaScript中,大括号关闭处并不会终止x的作用域。
JavaScript的作用域规则具体为:
1.变量声明的作用域开始于声明的地方,结束语所在函数的结尾,与代码的嵌套无关。
2.命名函数的作用域是指声明该函数的整个函数范围,与代码的嵌套无关。又称为机制提升。函数提升是整个代码块提升到它所在的作用域的最开始执行。
3.值得注意的是,函数可以在其作用域内被提前引用,但是变量不行。
有四个不同的方式可以进行函数调用,它们分别是:
1.作为一个函数进行调用,这是最简单的形式。
function text(){ }; text(); var mobile = function(){ }; mobile();
2.作为一个方法进行调用,在对象上进行调用,支持面向对象编程。
当一个函数被赋值给对象的一个属性,并使用引用改函数的这个属性进行调用时,那么函数就是作为一个方法进行调用。例如:
var a = {}; a.whatever = function() {}; a.whatever;
3.作为构造器进行调用,创建一个新对象。
将函数作为构造器使用,我们要在函数调用前使用 new 关键字。
function text(){ return this; }; //如果我们要将text()函数作为构造器进行调用,则要: new text();
在构造器调用时,如下特殊行为将会发生:
创建一个新的空对象。
传递给构造器的对象是this参数,从而成为构造器的函数上下文。
如果没有显式的返回值,新创建的对象则作为构造器的返回值进行返回。
因此,构造器的目的是要创建一个新对象并对其进行设置,然后将其作为构造器的返回值进行返回。即通过函数调用初始化创建新的对象。通过构造器,我们能更容易地创造出多个对象,而无需一次又一次进行相同的代码输入。
4.使用apply()和call()方法进行调用
这两种方法均可以显式指定任何一个对象作为函数调用的函数上下文,而无需在意this传递的参数。
这两种方法的区别在于:apply()传入的参数为作为函数上下文的对象与参数数组,而call()传入的是作为函数上下文的对象和参数列表而不是数组。
原文:https://www.cnblogs.com/AdamCenWeb/p/10724771.html