一、函数的声明方式
1.1 具名函数
function f(input1,input2){
return input1 + input2
}
f.name // 'f'
1.2 匿名函数

此种方式声明并没有语法错误,只是它不能单独使用,要使用匿名函数,就必须要把它付给另外一个变量








f(input1,input2)
等价于
f.call(asThis, input1,input2)
f.call(asThis, input1,input2) 其中 asThis 会被当做 this,[input1,input2] 会被当做 arguments 禁止使用 f(input1, input2),因为学会 .call 才能理解 this

四、this和arguments







5.1 定义
按照语法树,就近原则
我们只能确定变量是哪个变量,但是不能确定变量的值
作用域(scope)指的是变量存在的范围。在 ES5 的规范中,Javascript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。ES6 又新增了块级作用域,本教程不涉及。
函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。




函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是其声明时所在的作用域,与其运行时所在的作用域无关。

总之,函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。
很容易犯错的一点是,如果函数A调用函数B,却没考虑到函数B不会引用函数A的内部变量。

同样的,函数体内部声明的函数,作用域绑定函数体内部。

面试题


六、闭包
var n = 2
function f(){
console.log(n)
}
如果一个函数使用了它范围外的变量,那么(这个函数+这个变量)就叫做闭包
七、eval 命令
eval命令的作用是,将字符串当作语句执行。
