'farkı ne kapanışları vs PHP Javascript kapatma,?
Ne var JS kapaklar ve PHP kapanışları arasındaki farklar? Hemen hemen aynı şekilde çalışır? PHP kilitler yazarken farkında olmak, herhangi bir uyarı var mı?
CEVAP
Tek fark, her ikisi de isimsiz bir işlev yürütülür kapsamında saklanması ile nasıl başa
// JavaScript:
var a = 1;
var f = function() {
console.log(a);
};
a = 2;
f();
// will echo 2;
// PHP
$a = 1;
$f = function() {
echo $a;
};
$a = 2;
$f();
// will result in a "PHP Notice: Undefined variable: a in Untitled.php on line 5"
Bunu düzeltmek için use
sözdizimi kullanmanız gerekecek dikkat:
$a = 1;
$f = function() use ($a) {
echo $a;
};
$a = 2;
$f();
// but this will echo 1 instead of 2 (like JavaScript)
Anonim işleve sahip bir şekilde başvurular kullanman gerekecek JavaScript meslektaşı gibi davranır:
$a = 1;
$f = function() use (&$a) {
echo $a;
};
$a = 2;
$f();
// will echo 2
Bu JavaScript ve PHP kapanışları arasındaki en çarpıcı fark olduğunu düşünüyorum.
İkinci farkher JavaScript kapatma this
içerik mevcut olduğu anlamına gelir, bunu kullanabilirsiniz this
iç kapağın kendisini (her ne kadar bu genellikle oldukça karmaşık bir şey bul this
aslında ifade eder) - PHP mevcut kararlı sürüm (PHP 5.3) henüz destek $this
içine kapanma, ama PHP yaklaşan sürümü (PHP 5.4) desteği $this
bağlama ve yeniden birleştirme kullanarak $closure->bind($this)
(Object Extension RFC daha fazla bilgi.)
Üçüncü farkher iki dilde kapatma özellikleri nesneye atanan nasıl tedavi edilir:
// JavaScript
var a = {
b: function() {}
};
a.b(); // works
// PHP
$a = new stdClass();
$a->b = function() {};
$a->b(); // does not work "PHP Fatal error: Call to undefined method stdClass::b() in Untitled.php on line 4"
$f = $a->b;
$f(); // works though
Aynı eğer kapaklar sınıfı tanımlar: özellikleri atanır
class A {
public $b;
public function __construct() {
$this->b = function() {};
}
public function c() {
$this->b();
}
}
$a = new A();
// neither
$a->b();
// nor
$a->c();
// do work
Dördüncü fark:JavaScript kısıtlanmış nesneleri Kilitler nerede olduklarını tam teşekküllü nesneler vardır. Örneğin, PHP Kapatma olamaz Kendi özellikleri vardır:
$fn = function() {};
$fn->foo = 1;
// -> Catchable fatal error: Closure object cannot have properties
JavaScript ile yapabilirsiniz:
var fn = function() {};
fn.foo = 1;
fn.foo; // 1
Beşinci fark:İade kilitler hemen Javascript çağırdı olabilir:
var fn = function() { return function() { alert('Hi');}}
fn()();
PHP değil:
$fn = function() { return function() { echo('Hi');};};
$fn()(); // syntax error
Tam olarak&; kapatma" quot; bakın ...
JavaScript ile iki tarih arasındaki Ay...
YUI Kompresör veya yeni Google Kapatma...
İçinde döngüler JavaScript kapatma – b...
Nasıl JavaScript ile iki Tarih arasınd...