小tips:JS嚴格模式(use strict)下不能使用arguments.callee的替代方案


在函數內部,有兩個特殊的對象: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);
})();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM