让我们暂停一下“不要使用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>
答案 0 :(得分:1)
哪种行为正确?
没有指定。问题在于你的代码:你在with
块中有一个函数声明,这是无效的。函数声明必须是顶级程序/功能代码。
在Kangax优秀网站的不同浏览器中详细了解function declarations in blocks和how 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();
}());