【问题标题】:To which variable object statements inside with are bind?with里面的哪些变量对象语句被绑定?
【发布时间】:2017-04-04 17:42:28
【问题描述】:
function buildUrl() {
  var qs = "?debug=true";
  with(location){
    var url = href + qs;
  }
  return url;
}
buildUrl(); // it will work. WHY?

我正在研究 N. Zakas 的“面向 Web 开发人员的专业 JavaScript”,我遇到了这个 sn-p。据我了解,with 是一个通过将 location 对象推到前面来增加范围链的语句。

似乎url 局部变量被分配给了一个函数激活对象。为什么不分配给location

【问题讨论】:

  • 什么是“功能激活对象”? “将语句绑定到变量”是什么意思?无论如何,url 是一个声明为变量的变量,永远不会被解释为location 的属性。

标签: javascript with-statement scope-chain


【解决方案1】:

with 添加参数location 用于查找,但您的var url 仍被提升到包含函数 - 即buildUrl,因为您正在创建一个变量,而不是查找一个。

但是,你应该完全避免withsee the statement on MDN

【讨论】:

    【解决方案2】:

    不推荐使用 with 语句

    通常不鼓励使用 with 语句。 严格模式下禁止:

    function foo() { "使用严格";和({}); }

    SyntaxError: 严格模式代码可能不包含 'with' 语句 实践:不要使用 with 语句。

    with(foo.bar.baz) {
        console.log("Hello "+first+" "+last);
    }
    

    请使用具有短名称的临时变量。

    var b = foo.bar.baz; 
    console.log("Hello "+b.first+" "+b.last);
    

    【讨论】:

    • 这不是问题的答案。我知道它已被弃用,但我正在尝试了解其机制。
    • @PiotrekHryciuk 你为什么要试图了解一个你甚至无法在现代环境中使用的过时结构的机制?你在旧书堆里捡到这本书了吗?快速查找新书。
    • @torazaburo 有推荐吗? AFAIK 这是迄今为止最完整的 js 书籍。
    • 最新一版已经四年了,怎么可能是最全的书?它将 ES5 称为“新”,并将 ES6 称为“Harmony 中的新功能”。它指的是应用程序缓存,它不仅被服务工作者淘汰,而且在 HTML5.1 等中已被弃用。正如我所说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2023-03-10
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多