// 递归函数
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()())