函数的声明
(1) function命令
function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。
function print (s){
console.log(s);
}
上面的代码命名了一个print函数,以后使用print()这种形式,就可以调用相应的代码。这叫做函数的声明
尽量多用call调用函数。
函数的重复声明
如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。
function f () {
console.log(1);
}
f() // 2
function f () {
console.log(2);
}
f() // 2
上面的代码,后一次的函数声明覆盖了前面一次。而且,由于函数名的提升,前一次声明在任何时候都是无效的。
圆括号运算符,return 语句和递归
调用函数时,要使用圆括号运算符。圆括号之中,可以加入函数的参数。
函数体内部的return语句,表示返回。遇到return语句,就直接返回return后面的那个表达式的值,后面即使还有语句,也不会得到执行。也就是说,return语句所带的那个表达式,就是函数的返回值。return语句不是必需的,如果没有的话,该函数就不返回任何值,或者说返回undefined。
函数可以调用自身,这就是递归。
函数的属性和方法
(1) name 属性
函数的name属性返回函数的名字。
functionf1(){}
f1.name // "f1"
如果是通过变量赋值定义的函数,那么name属性返回变量名。
var f2 = function () {};
f2.name // "f2"
如果变量的值是一个具名函数,那么name属性返回function关键字之后的那个函数名。
var f3 = function myName () {};
f3.name // 'myName'
(2) length 属性
函数的length属性返回函数预期传入的参数个数,即函数定义之中的参数个数。
function f (a,b) {}
f.length // 2
(3) toString()
函数的toString方法返回一个字符串,内容是函数的源码。
函数作用域
作用域(scope)指的是变量存在的范围。
Javascript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。
函数内部可以直接读取全局变量。但是,函数外部无法读取函数内部声明的变量。
函数内部定义的变量,会在该作用域内覆盖同名全局变量。
eval 命令
eval命令的作用是,将字符串当作语句执行。
eval ('var a = 1;');
a // 1
eval内部声明的变量,不会影响到外部作用域。
this 和 arguments
f.call(asThis, input1,input2)
其中 asThis 会被当做 this,[input1,input2] 会被当做 arguments
this: 就是call的第一个参数可以用this得到。
aeguments: 就是call的后面参数可以用arguments得到。
闭包
概念:如果一个函数,使用了它范围外的变量,那么(这个函数+变量)就叫做闭包。