- arguments.callee
解决立即执行函数 没有函数名问题 闭包计算
// 计算阶乘
var num = (function(n){
if(n ==1) {
return 1;
}
return n * arguments.callee(n - 1);
}(10))
- fun.caller
被调用的环境
function test() {
demo();
}
function demo() {
console.log(demo.caller);
}
test(); // function test() { demo() } 输出被调用的环境
- 在严格模式下 callee caller 不能使用
练习题
// 1. 写出下面程序执行的结果
var foo = '123';
function print() {
var foo = '456';
this.foo = '789';
console.log(foo);
}
print(); // '456'; 自己有 打印自己的 自己没有往上找 访问的是foo 如果是this.foo 则为'’789'
// 2. 运行 test() 和 new test() 的结果分别是什么
var a = 5;
function test() {
a = 0;
console.log(a);
console.log(this.a);
var a;
console.log(a);
}
test(); // 0, 5, 0 在window执行 this指向window所以是5
new test(); // 0, undefined ,0 不存在this.a 所以是 undefined
// 3. 写出下面程序执行的结果
function print() {
console.log(foo);
var foo = 2;
console.log(foo);
console.log(hello);
}
print(); // undefined, 2, 报错 hello is not defined
// 4. 写出下面程序执行的结果
function print() {
var test;
test();
function test() {
console.log(1)
}
}
print(); // 1
// 5. 写出下面程序执行的结果
function print() {
var marty = {
name: 'marty',
printName: function() {
console.log(this.name);
}
}
var test1 = {name: 'test1'};
var test2 = {name: 'test2'};
var test3 = {name: 'test3'};
test3.printName = marty.printName;
var printName2 = marty.printName.bind({ name : 123 });
marty.printName.call(test1);
marty.printName.apply(test2);
marty.printName();
printName2();
test3.printName();
}
print();
// 6. 写出下面程序执行的结果
var bar = {a: '002'};
function print() {
bar.a = 'a';
Object.prototype.b = 'b';
return function inner() {
console.log(bar.a);
console.log(bar.b);
}
}
print()();