Ну, угадайте, что у JavaScript есть real закрытий. Не полупеченые, как 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();
Вы увидите «бар» вошли. Доказательство того, что замыкания работают без необходимости взлома. (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
}
Я не понимаю, что вы хотите. Я просто надеюсь, что ответ не «с». –
Что значит «без привязки к объекту окна»? Когда вы делаете закрытие, вы делаете привязку к охватывающей сфере. –
Это не должно сказать 'undefined'. Хорошо работает здесь http://jsbin.com/evacak/1/edit – elclanrs