gpt4 book ai didi

php - 将变量注入(inject)闭包

转载 作者:行者123 更新时间:2023-11-28 12:35:25 25 4
gpt4 key购买 nike

在不将其绑定(bind)到窗口对象的情况下实现此类目标的正确方法是什么?

x = function(fn)
{
foo = 'bar';
fn();
}

x(function()
{
console.log(foo) // error happens here
});

在 PHP 中,您可以通过“use”指令进行操作。

$foo = 'bar';
$fn = function() use($foo)
{
echo $foo; // bar
}

编辑:我稍微更改了这段代码。我想要实现的是,使声明的变量在闭包中可用,而不需要将其传递到那里。

foo = 'bar';
console.log(foo) // bar
console.log(window.foo) // bar
console.log(this.foo) // bar

我想用另一个绑定(bind)为“this”的对象来实现相同的效果。

最佳答案

好吧,猜猜看,JavaScript 有真正的闭包。不像 PHP 那样半生不熟,你必须在闭包中手动声明你想要使用的所有变量。

与此 PHP 代码等效的内容:

$foo = 'bar';
$fn = function() use($foo)
{
echo $foo; // bar
}

这是 JS 中的吗:

var foo = 'bar';
var fn = function() {
console.log(foo);
};

是的。你没有在 PHP 中调用你的函数,为什么我要在 JS 示例中调用它? :-)

顺便说一句,如果你在 JS 控制台中运行这段代码:

var foo = 'bar';
var fn = function() {
console.log(foo);
};
fn();

您将看到记录的“bar”。证明闭包无需任何修改即可工作。 (使用)

关于全局变量:$foo 变量在 PHP 示例中是全局变量。它们也在 JS 示例中。如果你想要一个非全局变量,你需要一个本地环境。大多数时候,一个函数。

使用非全局变量的 PHP 示例:

function baz() {
$foo = 'bar';
$fn = function() use ($foo) {
echo $foo;
};
}

带有非全局变量的 JS 示例:

function baz() {
var foo = 'bar';
var fn = function() {
console.log(foo);
};
}

最后一点:如果您不使用 var 在 JS 中声明新变量,它们就是隐含全局变量。在浏览器中,这意味着它们附加在 window 对象上。

如果您想比较 PHP/JS 如何声明全局变量:

PHP 代码:

$foo; // global
function bar() {
$_GLOBAL['baz']; // global
$bin; // local
}

JS代码:

foo; // global
function bar() {
window.baz; // global
var bin; // local
booze; // implied global
}

关于php - 将变量注入(inject)闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17565891/

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