javascript - 什么取代了 "with"?

标签 javascript

<分区>

我知道 with 被认为是一个“坏的部分”,但我从来不在乎,因为我只是小心地使用它(同上,顺便说一句,在 block 中使用 var 语句)。现在,我了解到 with 已从 EcmaScript 5.0 严格模式中删除。

这是我的用例:我有一个导出大约 20 或 30 个函数的库。我的大部分代码从不使用任何库,但使用的部分很多

现在,我的代码如下所示:

with (mylib) {
    f1(f2(f1(), f3())); // five or 10 more lines like this
}

为了合规,我必须...

a) 将所有函数移动到全局范围(糟糕)。

b) mylib.f1(mylib.f2(mylib.f1(), mylib.f3()));(冗长)

c) var x = mylib; x.f1(x.f2(x.f1(), x.f3()));(稍微不那么冗长但意义不大)。

请告诉我现在有更好的解决方案。我想要的是某种方式将对象的内容导出到一定级别的范围(正是 with 的用途)。

编辑:

有些事情我应该说得更清楚。我不希望人们向我解释为什么我不想做我想做的事;我希望人们向我解释如何做我实际上想做的事情。

问题是,出于我无法控制的原因,库的导出都有非常可识别的名称。与其称它们为 f1、f2 等,不如称它们为 Bobs_Library_Function_F1、Bobs_Library_Function_F2 等。

我只是不想要很多看起来像

的代码
Bobs_Library.Bobs_Library_Function_F1(Bobs_Library.Bobs_Library_Function_F2(Bobs_Library.Bobs_Library_Function_F1(), Bobs_Library.Bobs_Library_Function_F3()));

(真名并没有那么糟糕,它们实际上非常漂亮,加上前缀就可以了。)

任何认真地不同意这里的人,好吧,我希望你永远不要在应该使用 jQuery.whatever 时使用 $.whatever因为那会让你看起来像个大伪君子。

我正在考虑使用 $$.f1...

进一步编辑

说真的,感谢您提供的所有信息,但我并不是要就 (a)、(b) 或 (c) 是否最佳进行投票。我正在寻找能够很好地完成 with 功能的选项 (d)。

我是否至少从严格模式中获得了 block 作用域?

最佳答案

with 不好,因为在代码块内部,您不知道变量来自何处。 f1 等于 mylib.f1 还是 window.f1

我建议使用选项 b)。如果需要,您可以使用 c),它可能有助于处理长对象名称,但 b) 才是正确的选择。

编辑:另一个建议是使用选项a),但在完成后从窗口中删除引用。另外,注意不要覆盖 window 中的任何现有属性。如果需要,您可以将它们扔到另一个对象中进行保存。基于 @Alex's answer :

var bkupWin = {};  // Object to store existing window properties

for(var key in myLib) {
    if(myLib.hasOwnProperty(key)){
        if(window.hasOwnProperty(key)){
          bkupWin[key] = window[key];  // Backup current property
        }
        window[key] = myLib[key];  // Add property to window
    }
}

f1(f2(f1(), f3()));

for(var key in myLib){
    if(myLib.hasOwnProperty(key)){
        delete window[key]; // Remove property from window
        if(bkupWin.hasOwnProperty(key)){
          window[key] = bkupWin[key];  // Restore old property
        }
    }
}

关于javascript - 什么取代了 "with"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7095399/

相关文章:

javascript - 调用特权函数的父实现

javascript - 尝试点击加载外部插件不起作用

javascript - 在 webdriver-io 中使用 beforeEach

javascript - 单击按钮迭代图像

javascript - 设置谷歌地图标记javascript

javascript - 如何解决HTMLUnit中的 "JavaScriptException value = SyntaxError: with statements not allowed in strict mode"

javascript - 在 Algolia 索引中搜索二级数据集

javascript - bootstrap3 - hide.bs.dropdown 函数无论 .click 定义如何都会触发? ..用 fiddle

javascript - Dropzone 在 init 函数上添加 id 并排序

javascript - 如何在 Angular 2 中获取元素的宽度或高度?