当前位置: 首页 > 面试题库 >

防止JavaScript关闭继承作用域

杜烨伟
2023-03-14
问题内容

我正在寻找一种奇妙的方式来防止闭合继承周围的scrope。例如:

let foo = function(t){

  let x = 'y';

  t.bar = function(){

    console.log(x); // => 'y'

  });

};

我知道只有 两种方法可以 防止共享范围:

(1)使用阴影变量:

let foo = function(t){

  let x = 'y';

  t.bar = function(x){

    console.log(x); // => '?'

  });

};

(2)将函数体放在其他位置:

  let foo = function(t){

      let x = 'y';

      t.bar = createBar();

    };

我的问题是-有人知道防止闭包继承JS范围的第三种方法吗?花哨的东西很好。

我认为唯一可行的方法是vm.runInThisContext()在Node.js中。

让我们利用想象力来思考一下,并假设JS有一个private关键字,这意味着变量仅在该函数的作用域内是私有的,如下所示:

  let foo = function(t){

      private let x = 'y';  // "private" means inaccessible to enclosed functions

      t.bar = function(){

        console.log(x); // => undefined

      });

    };

和IIFE将不起作用:

let foo = function(t){

    (function() {
    let x = 'y';
    }());

   console.log(x); // undefined (or error will be thrown)
   // I want x defined here

  t.bar = function(){
    // but I do not want x defined here
    console.log(x); 
  }

  return t;
};

问题答案:

此技术有效:

创建帮助函数以在隔离的范围内运行函数

 const foo = 3;

 it.cb(isolated(h => {
    console.log(foo);  // this will throw "ReferenceError: foo is not defined"
    h.ctn();
 }));

您可能还对JavaScript with运算符有些运气



 类似资料:
  • 问题内容: 如果我们运行派生类,它将打印派生类和父类。是否有任何方法可以防止静态块的继承? // Class 1 // Class2 基本上我在父类中有一些方法要继承,但不希望实例化派生类时发生在父静态块中的处理。有没有办法做到这一点,否则我将不得不复制代码? 问题答案: 没有。 你不能这样做 。 静态的initialzier块不会被继承。 由于基类扩展了超类,因此在加载类时将执行静态块,即使超类

  • 问题内容: 我的侧边栏中有一个使用嵌套列表( 和 标记)的分层导航菜单。我使用的预制主题已经具有列表项的样式,但是我想更改顶级项的样式,但不能将其应用于子项。是否有一种简单的方法可以将样式应用于顶级列表项标签,​​而无需将样式层叠到其子级列表项?我知道我可以在子项目中显式添加重写样式,但是如果有一种简单的方法,只是说“将这些样式应用于此类并且不要级联,我真的很想避免必须重复所有样式代码”他们将其归

  • 我有几个配置文件,比如: application.yaml 我想我需要一些定制属性spring Binder.class定制,但我找不到任何解决方案。 提前感谢!

  • 本文向大家介绍javascript关于继承的用法汇总,包括了javascript关于继承的用法汇总的使用技巧和注意事项,需要的朋友参考一下 本文实例汇总了javascript关于继承的用法。分享给大家供大家参考。具体如下: 例子: 再看例子 一、用function实现: 或者同等效力的: 由于这只是将this作为参数,调用父类Person的构造函数,把赋予父类的所有域赋予Author子类,所以任何

  • 我有一个主(屏幕)gui窗口,需要打开几个“多输入”窗口(jdialog或当不可能使用jframe时),例如添加首选项(4个文本字段,带有2个文件选择器和2个单选按钮)。在这些JDialogs(或JFrames)中按OK/Cancel时,我的整个应用程序将关闭。我不想那样。我该怎么防止呢? 第一次尝试:我尝试了intelliJ选项“新- 第二次尝试:我“手工”编写了一个类,创建了一个JDialog

  • 本文向大家介绍JavaScript 类继承,包括了JavaScript 类继承的使用技巧和注意事项,需要的朋友参考一下 示例 继承的工作方式与其他面向对象的语言相同:在超类上定义的方法可在扩展子类中访问。 如果子类声明了自己的构造函数,则它必须先通过调用父构造函数,super()然后才能进行访问this。