知识点:
- 函数声明的三种方式;
- 函数的重复声明;
- 函数作为第一等公民;
- 函数名的提升
5.不能在条件语句中声明函数 - 函数name+length属性以及toString(0方法
- 函数作用域
- 函数本身的作用域
- 参数的省略
- 同名参数
- arguments对象
- 函数闭包
- 立即调用的函数表达式(iife)
- eval命令
- 间接调用和直接调用
答案:
- function命令
function print(s){
console.log(s);
}
函数表达式
var print = function(s){
console.log(s);
};
function构造函数
var add = new Funciton(){
'x',
'y',
'return(x+y)';
}
//你可以传递任意参数给function构造函数,只有最后一个参数
//会被当做函数体,如果只有一个参数,该参数就是函数体.
- 后面声明的会覆盖前面声明的.
-
函数与其他值地位相同.凡是可以使用值的地方,就能使用函数.可以把函数作为参数传递,作为返回值返回
- javascript引擎将函数名视为同变量名,所以采用function命令声明函数时,整个函数会像变量声明一样被提升到代码头部.
-
在条件语句中声明的函数,可能无效,意思就是相当于声明了这个函数,在任何地方都可以使用
- 函数name属性返回函数的名字,匿名函数返回空字符串,返回的内容是function与括号之间的部分;
length属性返回的是函数定义时的参数个数;
toString()方法返回的是函数声明,连同函数的注释部分都会返回 - 作用域(scope)指的是变量存在的范围,javascript只有两种作用域;一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取,另一种是函数作用域,变量只在函数内部存在.
在函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取
注意:局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量. -
函数本身也是一个值,也有自己的作用域,他的作用域与变量一样,就是其声明时所在的作用域,与其运行时所在的作用域无关.
- 函数的参数是可以省略的,省略不会报错
- 同名参数,取最后一个参数作为传入值
-
由于javascript允许函数有不定数目的参数,所以我们需要一种机制,可以在函数体内部读取所有参数,这就是arguments对象的由来
arguments对象,包括了运行时所有传进来的参数
arguments与数组很像,但是他是一个对象,不是数组,数组专有方法(slice和forEach等)不能在arguments对象上直接使用.
arguments对象带有一个callee属性,返回他所对应的原函数.这个属性在严格模式下是禁用的,因此不建议使用
- 闭包(colsure) 子函数读取函数内部的变量,可以简单理解成"定义在一个函数内部的函数",闭包最大的特点就是可以记住"诞生的环境".在本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁.
闭包最大用处的两个,一个是可以读取函数内部的变量,另一就是让这些变量保存在内存中. - javascript引擎规定,如果function关键字出现在行首,一律解释成语句,如果要函数立即执行,解决方法就是不要让funciton还出现在行首,通过圆括号开头解决,这样引擎就认为后面跟的是一个表达式,而不是函数定义语句,所以就避免了错误,立即调用函数表达式(immediately-invoked function expression),简称IIFE;
- eval命令的作用是,将字符串当做语句执行,由于eval没有自己的作用域,都在当前作用域内执行,因此可能会修改当前作用域的变量的值,造成安全问题,使用strict模式的话,eval内部声明的变量,不会影响到外部作用域,但是在此,模式下eval依然可以读写当前作用域的变量
运行速度较慢. - 直接调用的作用域总是当前作用域,间接调用的作用域总是全局作用域