在浏览器的控制台中运行下面代码:
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