闭包:用Javascript或者翻译语言中的PHP"use"关键字或C++捕获列表的等价物

Edg*_*ado 11 javascript php closures c++11 typescript

在PHP中,我们有一个简洁的use关键字,允许在使用闭包时使用"外部"变量,如下所示:

$tax = 10;
$totalPrice = function ($quantity, $price) use ($tax){  //mandatory 'use'
    return ($price * $quantity) * ($tax + 1.0);
};
Run Code Online (Sandbox Code Playgroud)

如果我们省略该use ($tax)部分,它将抛出一个错误,我非常喜欢.

类似地,在C++ 11中,我们也这样做,使用括号指定称为捕获列表的外部变量:

float tax = 10;
auto totalPrice = [tax](int quantity, float price){   //mandatory []
   return (price*quantity) * (tax + 1.0);
};
Run Code Online (Sandbox Code Playgroud)

与在php中一样,如果省略捕获列表,则会抛出错误.

在Javascript中,我们没有等效于此use关键字(或c ++ []),我们只是这样做:

var tax = 10;
var totalPrice = function (quantity, price){  //no need for 'use' or similar
    return (price * quantity) * (tax + 1.0);  //tax is usable here :(
};
Run Code Online (Sandbox Code Playgroud)

我不太喜欢那种自由,我强烈希望指定闭包函数可以访问的变量,否则会出现错误,原因超出了本问题的范围.

所以,我想知道,ES6中是否有一个特殊的关键字或运算符,或者是任何转换为​​javascript的语言?(CoffeeScript,TypeScript等)如果是这样,用哪种语言和语法是什么?

理想情况下,我想在转换时间(或之前)检测到,当一个变量未被明确"授权"用于闭包时,就像PHP/C++一样.

提前致谢

PS:请不要问我为什么我想用类似js的语言,这个辩论是另一个话题.

编辑:执行此检查的linter也会有所帮助

Mac*_*ity 0

我认为 JS 永远不会提供你想要的东西。PHP 有严格的范围。如果我在函数内定义变量,则它仅限于该函数。同样,在该函数外部定义的内容在该函数内部并不隐式可用。use,就像global简单地更改可以在特定范围内使用变量的位置和时间一样。

JS 默认将所有内容都放在全局范围内。事实上,这是一种奇怪的世界,因为您将变量的范围限制在函数内,您要么必须将其作为参数,要么显式地将范围限制为该变量

function bob(x) {
    // x is implicitly local
    y = 1; //global
    var z = 2; //local
}
Run Code Online (Sandbox Code Playgroud)

换句话说,JS中的所有变量都是use隐式声明的。