使用此代码:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
Run Code Online (Sandbox Code Playgroud)
我得到了这个意外的结果:
当我更改代码时:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
Run Code Online (Sandbox Code Playgroud)
我得到了预期的结果:
此外,如果eval
在内部函数中有任何调用,我可以按照我想要的方式访问我的变量(无论我传递给什么都没关系eval
).
同时,Firefox开发工具在两种情况下都给出了预期的行为.
与Chrome有什么关系,调试器的行为不如Firefox?我已经观察了这种行为一段时间,包括版本41.0.2272.43 beta(64位).
是不是Chrome的javascript引擎可以"平坦化"这些功能呢?
有趣的是,如果我添加在内部函数中引用的第二个变量,则该x
变量仍未定义.
我知道在使用交互式调试器时经常有范围和变量定义的怪癖,但在我看来,基于语言规范,应该是这些怪癖的"最佳"解决方案.所以我很好奇这是因为Chrome比Firefox更优化.以及在开发期间是否可以轻松禁用这些优化(也许在开放工具打开时应该禁用它们?).
此外,我可以使用断点和debugger
语句重现这一点.
这是我目前的代码:
const fn = parameter => {
// if, else ...
fn(X);
};
fn(0);
Run Code Online (Sandbox Code Playgroud)
现在,我不能使用这种方法,因为我需要使用参数调用函数,并且它必须可递归地调用.
如何重构上面的箭头函数,以便立即调用和递归调用?
关于void
运算符的MDN文章提到了一种声明立即调用的函数表达式(IIFE)的巧妙方法.
void function() {
console.log('hello');
}();
// is the same as...
(function() {
console.log('hello');
})();
Run Code Online (Sandbox Code Playgroud)
我觉得使用void
这个看起来很不错.传统的IIFE有很多括号,我觉得这看起来很混乱.
然后我尝试使用箭头函数重写此代码.
void () => {
console.log('hello');
}();
Run Code Online (Sandbox Code Playgroud)
这不解析.Chrome在第1行显示"Uncaught SyntaxError:Unexpected token",其中定义了箭头函数.Firefox说,"SyntaxError:无效的箭头 - 函数参数(箭头函数周围的括号可能有帮助)".
它在调用函数时甚至不解析.
void () => {
console.log('hello');
};
Run Code Online (Sandbox Code Playgroud)
我已经尝试过阅读这个(包括其他SO问题,比如这一个和这一个).
我想这与箭头函数AssignmentExpressions有关...?但我迷失了试图遵循ECMA-262规范.
有时我想为一个变量分配一个箭头函数的结果,但是如果我将箭头函数分配给该变量,它就会得到函数而不是该函数的返回,这是显而易见的.
let theNumber2 = ()=>{return 2};
Run Code Online (Sandbox Code Playgroud)
theNumber2
将包含该功能,只有我这样做theNumber2()
才会返回2.
有没有办法做这样的事情直接返回箭头功能?例如:
let theNumber2 = ()=>{return 2}(); // Note the () at the final
Run Code Online (Sandbox Code Playgroud)
有没有可做的事情?我的意思是,分配箭头函数调用?