gpt4 book ai didi

javascript - 闭包:等效于 PHP "use"关键字或 Javascript 或转译器语言中的 C++ 捕获列表

转载 作者:可可西里 更新时间:2023-10-31 22:14:26 25 4
gpt4 key购买 nike

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

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

如果我们省略 use ($tax) 部分,它会抛出一个错误,我很喜欢。

与 C++ 11 类似,我们也这样做,指定外部变量,称为 capture list , 带括号:

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

与在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 :(
};

我不太喜欢这种自由,我非常喜欢指定闭包函数可以访问的变量,否则会出现错误,原因超出了这个问题的范围。

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

理想情况下,我想在转译时(或之前)检测变量何时未被明确“授权”用于闭包,这与 PHP/C++ 非常相似。

提前致谢

PS:请不要问我为什么要用类似js的语言,那是另一个话题。

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

最佳答案

不幸的是,您可以想象关键字 use 在 javascript 中不存在,但要实现您正在寻找的结果,有几种方法。

这是您的示例,其中 totalPrice 是一个函数,tax 是全局的。

// Your example
var tax = 10;
var totalPrice = function (quantity, price) {
return (price * quantity) * (tax + 1.0);
};
var price = totalPrice(1, 1);
console.log ("Price YE is : " + price);

所以我认为模拟更多关键字 use 的解决方案可能是生成一个函数,该函数在子范围内初始化 tax 并返回一个函数:

// Example 1 return function
function generatePriceCalculator(tax) {
return function(quantity, price) {
if ("undefined" === typeof tax) {
throw "tax is undefined";
}

return (price * quantity) * (tax + 1.0);
};
};

var priceCalculator = generatePriceCalculator(20);
var price1 = priceCalculator(1, 1);
console.log ("Price Example 1 is : " + price1);

如您所见,generatePriceCalculator 在返回的函数中设置了 tax 的值。

另一种选择是生成一个外部函数以在闭包内部调用。

// Example 2 function return tax
function getTax() {
return 30;
}
var totalPrice2 = function (quantity, price) {
var tax = getTax();
return (price * quantity) * (tax + 1.0);
};
var price2 = totalPrice2(1, 1);
console.log ("Price Example 2 is : " + price2);

你可以在这里看到所有的:

https://jsfiddle.net/jo9yzoke/1/

关于javascript - 闭包:等效于 PHP "use"关键字或 Javascript 或转译器语言中的 C++ 捕获列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34701341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com