在函數內部,有兩個特殊的對象:arguments 和 this。其中, arguments 的主要用途是保存函數參數, 但這個對象還有一個名叫 callee 的屬性,該屬性是一個指針,指向擁有這個 arguments 對象的函數。
如下,一般在非嚴格模式下遞歸調用一般這樣使用:
function factorial(num){ if(num<=1){ return 1; }else { return num * arguments.callee(num-1); } } console.log(factorial(4)); //24
但是如果代碼是在嚴格模式下開發:
"use strict"; function factorial(num){ if(num<=1){ return 1; }else { return num * arguments.callee(num-1); } } console.log(factorial(4));
結果:Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
在嚴格模式下不能通過腳本訪問arguments.callee
,訪問這個屬性會報錯,那么可以使用命名函數表達式來達到相同的結果:
"use strict"; var factorial = (function f(num){ if(num<=1){ return 1; }else { return num * f(num-1); } }) console.log(factorial(4)); //24
以上代碼創建了一個名為f()的命名函數表達式,然后將它賦值給變量factorial
,即是把函數賦值給另外一個變量,函數的名字仍然有效。
在看一段代碼:
(function foo(bar) { if (bar) { return; } foo(true); })();