在浏览器的控制台中运行下面代码:
var obj = {
fn1: function (n) {
if (n > 3) {
return;
}
console.log('n=' + n);
n++;
fn1(n);
}
};
obj.fn1(0);
输出结果如下:
n=0
ReferenceError: fn1 is not defined
将 obj 的定义改为下面的代码(将上面的 fn1(n); 改为 arguments.callee(n); 或 this.fn1(n); 或 obj.fn1(n);),不会报错
var obj = {
fn1: function (n) {
if (n > 3) {
return;
}
console.log('n=' + n);
n++;
arguments.callee(n);
// this.fn1(n);
// obj.fn1(n);
}
};
直接写 fn1(n) ,这样调用的是全局作用域下声明的函数 fn1,由于我们没有在全局作用域中声明 fn1,所以抛出了错误。
使用 this.fn1(),调用当前作用域的 fn1,由于第一次调用时使用的是 obj.fn1,所以当前作用域为 obj,可以在 obj 中找到 fn1 ,正常执行。
下面代码可以说明直接写 fn1() 调用的是全局作用域下声明的 fn1,而不是当前作用域的上层作用域中的 fn1。
var obj = {
fn1: function () {
console.log('this is fn1');
},
innerObj: {
fn2: function () {
console.log('this is fn2');
fn1();
}
}
};
obj.innerObj.fn2();
this is fn2
ReferenceError: fn1 is not defined