不一致的`with`行为 - 在函数内无法访问 - 这是一个chrome bug吗?

时间:2014-06-10 20:25:47

标签: javascript cross-browser

让我们暂停一下“不要使用with”合唱,并假设我有一个合法的用例*。 If I have this code

with({x: "hi"}) {
  console.log("outside x is", x);
  function aFunc() {
    console.log("inside a func x is", x);
  }
  aFunc();
}

在IE11和Firefox中,两个语句都打印为“hi”。在chrome中,我在循环内的x上得到ReferenceError

哪种行为正确?这是一个铬虫吗?


*。用例是我在浏览器IDE环境中允许用户在提供附加功能的同时输入javascript,并且不希望将函数直接附加到全局范围(想想jsbin / jsfiddle,但是针对特定任务)。 / p>

1 个答案:

答案 0 :(得分:1)

  

哪种行为正确?

没有指定。问题在于你的代码:你在with块中有一个函数声明,这是无效的。函数声明必须是顶级程序/功能代码。

在Kangax优秀网站的不同浏览器中详细了解function declarations in blockshow they are handled

  

这是一个铬虫吗?

没有。将您的代码更改为

with({x: "hi"}) {
  console.log("outside x is", x);
  var aFunc = function() {
    console.log("inside a func x is", x);
  }
  aFunc();
}

IEFE也应该有效:

with({x: "hi"}) (function(){
  console.log("outside x is", x);
  function aFunc() {
    console.log("inside a func x is", x);
  }
  aFunc();
}());