在没有将它绑定到窗口对象的情况下,实现这样的事情的正确方法是什么?
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
我想达到同样的效果,另一个对象被绑定为“this”。
答案 0 :(得分:7)
嗯,猜猜看,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”已记录。证明闭包工作而不需要一些黑客攻击。 (use
)
关于全局变量:$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
}
答案 1 :(得分:0)
如果你想让你的窗户物体保持清洁,那么这可能是你需要的。
(function(){
var foo = 'bar';
(function(){
console.log(foo) // bar
})();
})();
console.log(window.foo); //undefined
答案 2 :(得分:0)
答案是在PHP中选择要包含的内容。在JS中,没有办法告诉闭包选择要包含的变量。附上所有词汇可用变量。
但是很难说出你想要的东西,看起来你想要隐藏一个闭包变量
唯一的解决方法是隐藏变量(通过在内部函数中声明它们)你不想要
答案 3 :(得分:0)
在你问题的后半部分,你会问到打电话
将this
设置为指定对象的函数。
调用函数fun
将this
设置为objectThatBecomesThis
并将参数设置为(arg1,arg2,...),使用:
fun.apply(objectThatBecomesThis, [arg1,arg2,...])
其中第二个参数(可选)是函数的参数数组。
因为第二个参数是一个数组,所以它使用[]方括号。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
答案 4 :(得分:-1)
如果我了解您的需要,您可以这样做:
var closure_variables = new Object();;
closure_variables.foo = 'bar';
window.bar = 'foo'
(function(variables)
{
console.log(variables.foo) // undefined
console.log(bar) // foo
})(closure_variables)
或者你甚至可以在参数中直接传递foo。