第七章:函数表达式
// 递归函数 function factorial(num) { if (num === 1) { return 1 } else { return num * factorial(num - 1); } } console.log(factorial(99)); /*arguments.callee ==== 表示函数本身 在递归时使用 */ function fun() { console.log(arguments.callee) } fun() /*闭包==貌似啊好牛*的样子 * 是指有权访问另一个函数作用域中的变量的函数 * 创建闭包的常见方式是在一个函数内部创建另一个函数 * */ function fn() { return function () { console.log(1) } } fn()(); /*每个函数都有一个执行环境,这个执行环境都有一个表示变量的对象 * 全局环境的变量对象始终存在*/ function compare(a, b) { if (a > b) { return 1; } else if (a < b) { return -1; } else { return 0; } } /*当调用这个函数时会创建一个包含 arguments,a,b 的活动对象 * 全局执行环境的变量对象在compare() 执行环境的作用域中处于第二位 * 会创建一个预先包含全局变量对象的作用域链,这个作用被保存在内部的[[Scope]]属性中 * * 函数执行时,会为函数创建一个执行环境 * */ compare(1,2); /*一般而言当函数执行结束后,局部活动对象就会被销毁,内存中仅保存全局作用域(但是闭包的环境除外)*/ /*this对象是在运行时基于函数的执行环境绑定的 * 1 全局函数中this指向window * 2 而当函数作为某个对象的方法调用时this 就是那个对象 * * 不过匿名函数的执行环境是具有全局性的 (因此this对象通常指向window) * * 每个函数被调用时都会自动取得两个特殊变量, * this * arguments * */ var name='the window'; var obj={ name:'my obj', getName:function () { return function () { return this.name }.bind(this);//加上bind(this)这里的this就是指这个对象了 } }; console.log(obj.getName()())