# 函数

调用上下文,就是this

使用this判断当前执行环境

var strict  =(function(){return !this}())

标识符arguments是指向实参对象的引用。它是类数组对象。
1
2
3

# 定义函数

函数表达式, 函数声明

# 函数调用

  • 作为方法调用
  • 作为函数调用
  • new 构造函数调用
  • call apply调用

一个调用表达式由多个函数表达式组成,每个函数表达式都是由一个函数对象和左圆括号,参数列表,右括号组成。参数列表由0个或多个参数表达式组成。

# callee 和 caller

callee 属性指当前正在执行的函数

caller 指调用当前执行的函数的函数,通过caller属性可以访问调用栈。

# 闭包

共享私有状态

var couter = (function() {
    var count = 0
    return function (){
        return  ++count
    }
}())

var a = couter()
var b = couter()
var c = couter()
var d = couter()


console.log('a :>> ', a);

console.log('b :>> ', b);
console.log('c :>> ', c);
console.log('d :>> ', d); 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

私有属性存取器

dsf

1
2

js采用词法作用域。函数的执行依赖变量作用域,这个作用域在函数定义的时决定的,不是调用时决定的。

var scope = 'g'

function checks() {
    var scope = 'l'
    function f(){console.log(scope);}
    return f
}
checks()()


1
2
3
4
5
6
7
8
9
10

为了实现这种词法作用域,js函数对象的内部状态不仅包含函数的代码逻辑,还必须引用当前的作用域链。

函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性叫闭包

当调用函数时闭包所指向的作用域链和定义函数时的作用域链不是同一个作用域链时,就有意思了。

当一个函数嵌套另一个函数,外部函数将嵌套的函数对象作为返回值返回的时候会发生这种事情,