1 函数定义
- 使用function关键字来定义,即function fName(para,...){ statment;...;},可使用在函数声明语句与函数定义表达式这两种形式中
-
函数名称标识符。
-
是函数声明语句必需的部分。它的用途就像变量的名字,新定义的函数对象会赋值给这个变量
-
但对函数定义表达式来说,这个名字是可选的:如果存在,该名字只存在于函数体中,井指代该函数对象本身
-
-
一对圆括号(),其中包含由0个或者多个用逗号隔开的标识符组成的列表。这些标识符是函数的参数名称,它们就像函数体中的局部变量一样
-
一对花括号{ },其中包含0条或多条JavaScript语句。这些语句构成了函数体:一旦调用函数,就会执行这些语句
-
- 使用函数声明语句定义函数
- 实际上声明了一个变量, 并把一个函数对象赋值给它
- 函数可以命名, 这个名称用来来指代自己,成为函数内部的一个局部变量
- 这种方式定义的函数,拥有函数提升特性,即函数声明语句 被“提升” 到外部脚本或外部函数作用域的顶部, 使之可以被它定义之前的代码所调用
- 使用 表达式方式定义函数
- 函数名称通常被省略,以使定义代码更紧凑,如果不省略函数名称, 函数的局部作用域将会包含一个绑定到函数对象的名称。 实际上, 函数的名称将成为函数内部的一个局部变量
- 这种方式定义的函数,即要对一个变量进行赋值,而赋值不会提升,所以这种方式定义函数,必须先定义后调用
- return与函数返回值
- 函数中return 语句没有一个与之相关的表达式或省略了return, 则它返回undefined值给调用者
- 没有return 语句的函数,有时也叫过程
- 函数嵌套
- 作用域规则:被嵌套函数可以访问嵌套函数的参数和变量
- 使用函数声明的函数,不可出现在条件语句、循环语句、try/cache/finally及with语句中
- 使用表达式定义的函数,可以出现在任何JavaScript语句中
//函数声明 function myFunc(name,age){ return 'My name is ' + name + ', My old is' +age+'.' ; } //函数定义表达式 var f = function(name){ return 'My name is ' + name; } //或者 var f = function fName(name){ return 'My name is ' + name; }
//无return
function myalter(msg){
alter(msg);
}
//函数嵌套
function fName(x,y){
function func(a,b){
return a + b;
}
return func(x,y);
}
2 函数调用
- 作为函数
-
非严格模式的ECMAScript 5对函数调用的规定, 调用上下文(this的值)是全局对象
-
在严格模式下,调用上下文则是undefined
-
-
- 以函数形式调用的函数通常不使用this关键字。但 “this” 可以用来判断当前是否是严格模式
//定义并调用一个函数来确定当前脚本运行时是否为严格模式 var strict = (function() { return !this; }());
- 作为方法
- 任何函数作为方法调用,实际上都会传入一个隐式的实参(即方法调用的母体对象)。通常,基于哪个对象的方法可以进行多种操作
- 方法和this关键字是面向对象编程的核心,当方法不需要返回值时,如果返回this,即方法调用的母体对象,就可形成链式调用
- this是关键字, 不是变量, 也不是属性名。 JavaScript的语住不允许给this赋值
- 和变量不同, 关键字this没有作用域的限制, 嵌套的函数不会从调用它的函数中继承 this
- 如果嵌套函数作为方法调用, this指向调用它的对象
- 如果嵌套函数作为函数调用, 非严格模式下this指向全局对象,严格模式下this的值是undefined
- 调用嵌套函数时
- this指向不是调用它的外层函数的上下文
- 要访问调用它的外层函数的this值, 可将this的值保存在和内部函数都同在一个作用域内的变量里,通常使用变量self来保存this
var obj = { method:function(){ self = this;//将this保存到同一作用域的self变量中 console.log(this === obj);//true innerF(); } function innerF(){//嵌套函数 console.log(self == obj);//true console.log(this == obj);//是全局变量或unfined } }
- 作为构造函数
- 通过函数的方法call()或者apply()间接调用