zoukankan      html  css  js  c++  java
  • 小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);
    })();
  • 相关阅读:
    [oracle 使用(1)] win7/10 下Oracle10g的安装与卸载
    [原创]利用爬虫技术获取网页数据,以及想要的指定数据
    [mysql使用(1)] 64位Linux下安装mysql-5.7.13-linux-glibc2.5-x86_64
    aop 常见的问题
    Git技巧:右键菜单怎么去除?
    jrebel激活
    python与mysql连接
    linux下mysql的安装
    Linux下jdk和tomcat安装
    Lotto
  • 原文地址:https://www.cnblogs.com/moqiutao/p/7509991.html
Copyright © 2011-2022 走看看