M K*_*M K 0 javascript php closures
在没有将它绑定到窗口对象的情况下,实现这样的东西的正确方法是什么?
x = function(fn)
{
foo = 'bar';
fn();
}
x(function()
{
console.log(foo) // error happens here
});
Run Code Online (Sandbox Code Playgroud)
在PHP中,您可以通过"use"指令.
$foo = 'bar';
$fn = function() use($foo)
{
echo $foo; // bar
}
Run Code Online (Sandbox Code Playgroud)
编辑:我改变了一段代码.我想要实现的是,在闭包中使一个声明的变量可用,而不需要在那里传递它.
foo = 'bar';
console.log(foo) // bar
console.log(window.foo) // bar
console.log(this.foo) // bar
Run Code Online (Sandbox Code Playgroud)
我希望实现相同的效果,另一个对象被绑定为"this".
嗯,猜猜看,JavaScript有真正的闭包.不像PHP那样是半生不熟的,你必须手动声明你想要使用的闭包中的所有变量.
相当于这个PHP代码:
$foo = 'bar';
$fn = function() use($foo)
{
echo $foo; // bar
}
Run Code Online (Sandbox Code Playgroud)
这是在JS:
var foo = 'bar';
var fn = function() {
console.log(foo);
};
Run Code Online (Sandbox Code Playgroud)
是的.你不是用PHP调用你的函数,为什么我会在JS例子中调用它?:-)
顺便说一下,如果你在JS控制台中运行这段代码:
var foo = 'bar';
var fn = function() {
console.log(foo);
};
fn();
Run Code Online (Sandbox Code Playgroud)
您将看到"bar"已记录.证明闭包工作而不需要一些黑客攻击.(use)
关于全局变量:$foo变量在PHP示例中是全局变量.它们也在JS的例子中.如果要拥有非全局变量,则需要本地环境.大多数时候,一个功能.
带有非全局变量的PHP示例:
function baz() {
$foo = 'bar';
$fn = function() use ($foo) {
echo $foo;
};
}
Run Code Online (Sandbox Code Playgroud)
带有非全局变量的JS示例:
function baz() {
var foo = 'bar';
var fn = function() {
console.log(foo);
};
}
Run Code Online (Sandbox Code Playgroud)
最后一点注意:如果你不使用var在JS中声明新变量,那么它们就是隐含的全局变量.在浏览器中,这意味着它们附加在window对象上.
如果你想要PHP/JS比较如何声明全局变量:
PHP代码:
$foo; // global
function bar() {
$_GLOBAL['baz']; // global
$bin; // local
}
Run Code Online (Sandbox Code Playgroud)
JS代码:
foo; // global
function bar() {
window.baz; // global
var bin; // local
booze; // implied global
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1070 次 |
| 最近记录: |