{"id":33050,"date":"2025-10-29T01:01:26","date_gmt":"2025-10-28T22:01:26","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/"},"modified":"2025-10-29T01:01:26","modified_gmt":"2025-10-28T22:01:26","slug":"closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/","title":{"rendered":"Closure \u00d6ncesi Ba\u011flam: JavaScript&#8217;in Kalbine Bir Yolculuk"},"content":{"rendered":"<p><body><\/p>\n<p>JavaScript d\u00fcnyas\u0131na yeni ad\u0131m atanlar veya tecr\u00fcbeli geli\u015ftiriciler i\u00e7in closure&#8217;lar, ba\u015flang\u0131\u00e7ta gizemli ve karma\u015f\u0131k g\u00f6r\u00fcnebilir. Ancak endi\u015felenmeyin, bu \u201csihirli\u201d yap\u0131lar asl\u0131nda JavaScript&#8217;in temel mekanizmalar\u0131n\u0131n do\u011fal bir sonucudur. Closure&#8217;lar\u0131 tam anlam\u0131yla kavrayabilmek i\u00e7in, \u00f6ncelikle JavaScript&#8217;in y\u00fcr\u00fctme ba\u011flam\u0131, kapsam (scope) ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">&#8216;this&#8217;<\/a> anahtar kelimesinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine anlamak kritik \u00f6nem ta\u015f\u0131r. Bu kapsaml\u0131 rehberde, kodunuzun derinliklerine inerek, ba\u011flam kavram\u0131n\u0131n inceliklerini ad\u0131m ad\u0131m ke\u015ffedecek ve b\u00f6ylece closure&#8217;lara sa\u011flam bir zemin haz\u0131rlayaca\u011f\u0131z.<\/p>\n<p>Modern JavaScript uygulamalar\u0131, kullan\u0131c\u0131 etkile\u015fimlerinden veri y\u00f6netimine kadar pek \u00e7ok farkl\u0131 katmanda karma\u015f\u0131k mant\u0131klar bar\u0131nd\u0131r\u0131r. Bu karma\u015f\u0131kl\u0131\u011f\u0131n \u00fcstesinden gelmek i\u00e7in, geli\u015ftiricilerin kodlar\u0131n\u0131n sadece ne yapt\u0131\u011f\u0131n\u0131 de\u011fil, ayn\u0131 zamanda <em>nas\u0131l<\/em> ve <em>nerede<\/em> \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 da bilmesi gerekir. \u0130\u015fte tam da bu noktada \u201cba\u011flam\u201d kavram\u0131 devreye girer. Ba\u011flam, bir fonksiyonun veya kod blo\u011funun ne zaman, nerede ve hangi verilere eri\u015febilece\u011fini belirleyen \u00e7evresel ko\u015fullar b\u00fct\u00fcn\u00fcd\u00fcr. \u00c7o\u011fu zaman g\u00f6z ard\u0131 edilen bu temel yap\u0131 ta\u015flar\u0131, de\u011fi\u015fkenlerin ya\u015fam d\u00f6ng\u00fcs\u00fcnden fonksiyonlar\u0131n davran\u0131\u015flar\u0131na, hatta performans optimizasyonlar\u0131na kadar her \u015feyi etkiler.<\/p>\n<p>D\u00fc\u015f\u00fcnsenize, bir kod par\u00e7as\u0131 yazd\u0131n\u0131z ve bekledi\u011finiz gibi \u00e7al\u0131\u015fm\u0131yor. Muhtemelen sorun, o kodun hangi ba\u011flamda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 tam olarak anlayamaman\u0131zdan kaynaklan\u0131yordur. \u00d6zellikle asenkron i\u015flemler, olay dinleyicileri veya mod\u00fcler yap\u0131larla \u00e7al\u0131\u015f\u0131rken, <a href=\"https:\/\/www.javascripttutorial.net\/javascript-this\/\" target=\"_blank\">&#8216;this&#8217;<\/a> anahtar kelimesinin beklenmedik davran\u0131\u015flar\u0131 veya d\u0131\u015f kapsamdaki de\u011fi\u015fkenlere eri\u015fim sorunlar\u0131 s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan senaryolard\u0131r. \u0130\u015fte bu gibi durumlarda, y\u00fcr\u00fctme ba\u011flam\u0131n\u0131, de\u011fi\u015fken kapsam\u0131n\u0131 ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">&#8216;this&#8217;<\/a> de\u011ferinin nas\u0131l belirlendi\u011fini bilmek, sizi saatler s\u00fcren hata ay\u0131klama s\u00fcre\u00e7lerinden kurtarabilir. Closure&#8217;lar ise, tam da bu ba\u011flam y\u00f6netimi yeteneklerinin bir sonucudur. D\u0131\u015f kapsamdaki de\u011fi\u015fkenleri &#8220;kapatma&#8221; (closure) yetene\u011fi, ancak o de\u011fi\u015fkenlerin ya\u015fam s\u00fcresini ve eri\u015fim kurallar\u0131n\u0131 belirleyen ba\u011flam\u0131 tam olarak anlad\u0131\u011f\u0131m\u0131zda anlam kazan\u0131r. Bu rehberde, bu temel prensipleri somut \u00f6rneklerle ele alacak, b\u00f6ylece JavaScript&#8217;in kalbine giden yolu ayd\u0131nlataca\u011f\u0131z.<\/p>\n<p>K\u0131sacas\u0131, closure&#8217;lar, JavaScript&#8217;in en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri olabilir; ancak temel ba\u011flam mekanizmalar\u0131n\u0131 anlamadan onlar\u0131 do\u011fru bir \u015fekilde kullanmak veya potansiyel tuzaklardan ka\u00e7\u0131nmak neredeyse imkans\u0131zd\u0131r. Bu makale, sizi bu temel bilgilerle donatarak, daha temiz, daha \u00f6ng\u00f6r\u00fclebilir ve daha az hataya a\u00e7\u0131k kodlar yazman\u0131z i\u00e7in gerekli altyap\u0131y\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h2>JavaScript&#8217;te Y\u00fcr\u00fctme Ba\u011flam\u0131 (Execution Context) Nedir?<\/h2>\n<p>JavaScript motoru, kodumuzu \u00e7al\u0131\u015ft\u0131r\u0131rken her \u015feyi bir &#8220;y\u00fcr\u00fctme ba\u011flam\u0131&#8221; i\u00e7inde yapar. Bu y\u00fcr\u00fctme ba\u011flam\u0131, kodun \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 ortam\u0131 tan\u0131mlayan soyut bir kavramd\u0131r. Her JavaScript kodu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, motor bir y\u00fcr\u00fctme ba\u011flam\u0131 olu\u015fturur. Temel olarak iki t\u00fcr y\u00fcr\u00fctme ba\u011flam\u0131 vard\u0131r:<\/p>\n<ul>\n<li><strong>Global Y\u00fcr\u00fctme Ba\u011flam\u0131 (Global Execution Context &#8211; GEC):<\/strong> JavaScript motoru bir betik dosyas\u0131n\u0131 ilk kez y\u00fckledi\u011finde olu\u015fturulan en d\u0131\u015ftaki ba\u011flamd\u0131r. Taray\u0131c\u0131 ortam\u0131nda genellikle <code>window<\/code> objesini, Node.js ortam\u0131nda ise <code>global<\/code> objesini ifade eder. T\u00fcm global de\u011fi\u015fkenler ve fonksiyonlar bu ba\u011flamda tan\u0131mlan\u0131r. Betik \u00e7al\u0131\u015fmaya ba\u015flad\u0131\u011f\u0131nda ilk ve tek olu\u015fan ba\u011flam budur.<\/li>\n<li><strong>Fonksiyon Y\u00fcr\u00fctme Ba\u011flam\u0131 (Function Execution Context &#8211; FEC):<\/strong> Bir fonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda yeni bir fonksiyon y\u00fcr\u00fctme ba\u011flam\u0131 olu\u015fturulur. Her fonksiyon \u00e7a\u011fr\u0131s\u0131 kendi benzersiz ba\u011flam\u0131n\u0131 yarat\u0131r. Bu ba\u011flam, fonksiyonun kendi de\u011fi\u015fkenlerini, arg\u00fcmanlar\u0131n\u0131 ve i\u00e7 i\u00e7e ge\u00e7mi\u015f fonksiyonlar\u0131n\u0131 bar\u0131nd\u0131r\u0131r. Bir fonksiyonun i\u015fi bitti\u011finde, ilgili fonksiyon y\u00fcr\u00fctme ba\u011flam\u0131 \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131ndan (call stack) \u00e7\u0131kar\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Her y\u00fcr\u00fctme ba\u011flam\u0131 \u00fc\u00e7 ana bile\u015fenden olu\u015fur:<\/p>\n<ol>\n<li><strong>De\u011fi\u015fken Ortam\u0131 (Variable Environment):<\/strong> Bu, ba\u011flam i\u00e7inde tan\u0131mlanan t\u00fcm de\u011fi\u015fkenleri (<code>var<\/code>, fonksiyon bildirimleri) ve fonksiyonlar\u0131n arg\u00fcmanlar\u0131n\u0131 i\u00e7erir. ES6 ile birlikte gelen <code>let<\/code> ve <code>const<\/code> anahtar kelimeleriyle tan\u0131mlanan de\u011fi\u015fkenler ise, daha \u00e7ok &#8220;Lexical Environment&#8221; i\u00e7inde ele al\u0131n\u0131r ve TDZ (Temporal Dead Zone) gibi farkl\u0131 davran\u0131\u015flar sergilerler.<\/li>\n<li><strong>S\u00f6zc\u00fcksel Ortam (Lexical Environment):<\/strong> Kapsam zincirini ve mevcut kapsamdaki tan\u0131mlay\u0131c\u0131lar\u0131 (identifier) tutan yap\u0131d\u0131r. Bu, kodun fiziksel olarak nerede yaz\u0131ld\u0131\u011f\u0131na g\u00f6re belirlenir ve de\u011fi\u015fkenlere eri\u015fim kurallar\u0131n\u0131 tan\u0131mlar. \u0130\u00e7erisinde iki ana k\u0131s\u0131m bulunur: bir ortam kayd\u0131 (environment record) ve d\u0131\u015f ortam referans\u0131 (outer environment reference). Ortam kayd\u0131, mevcut ba\u011flamdaki de\u011fi\u015fken ve fonksiyon tan\u0131mlar\u0131n\u0131 saklarken, d\u0131\u015f ortam referans\u0131 ise kapsayan (parent) s\u00f6zc\u00fcksel ortama i\u015faret eder. Bu zincirleme mekanizmas\u0131, JavaScript&#8217;in kapsamsal (lexical) kapsam modelini olu\u015fturur.<\/li>\n<li><strong><code>this<\/code> Ba\u011flam\u0131:<\/strong> <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">&#8216;this&#8217;<\/a> anahtar kelimesinin hangi objeyi referans ald\u0131\u011f\u0131n\u0131 belirleyen bile\u015fendir. Bu de\u011fer, fonksiyonun nas\u0131l \u00e7a\u011fr\u0131ld\u0131\u011f\u0131na ba\u011fl\u0131 olarak dinamik olarak de\u011fi\u015febilir, bu da \u00e7o\u011fu geli\u015ftiricinin kafas\u0131n\u0131 kar\u0131\u015ft\u0131ran bir noktad\u0131r.<\/li>\n<\/ol>\n<p>T\u00fcm bu y\u00fcr\u00fctme ba\u011flamlar\u0131, bir &#8220;\u00c7a\u011fr\u0131 Y\u0131\u011f\u0131n\u0131&#8221; (Call Stack) ad\u0131 verilen LIFO (Last-In, First-Out) prensibiyle \u00e7al\u0131\u015fan bir veri yap\u0131s\u0131nda y\u00f6netilir. Bir fonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, onun y\u00fcr\u00fctme ba\u011flam\u0131 y\u0131\u011f\u0131na eklenir. Fonksiyon i\u015fini bitirdi\u011finde, ba\u011flam y\u0131\u011f\u0131ndan \u00e7\u0131kar\u0131l\u0131r. Global y\u00fcr\u00fctme ba\u011flam\u0131 her zaman y\u0131\u011f\u0131n\u0131n en alt\u0131nda bulunur.<\/p>\n<pre><code>\nfunction birinciFonksiyon() {\n  console.log(\"Birinci fonksiyon \u00e7al\u0131\u015f\u0131yor.\");\n  ikinciFonksiyon();\n  console.log(\"Birinci fonksiyon bitti.\");\n}\n\nfunction ikinciFonksiyon() {\n  console.log(\"\u0130kinci fonksiyon \u00e7al\u0131\u015f\u0131yor.\");\n}\n\nbirinciFonksiyon();\n\/\/ \u00c7a\u011fr\u0131 Y\u0131\u011f\u0131n\u0131 Olu\u015fumu:\n\/\/ 1. Global EC (y\u0131\u011f\u0131na eklenir)\n\/\/ 2. birinciFonksiyon EC (birinciFonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda y\u0131\u011f\u0131na eklenir)\n\/\/ 3. ikinciFonksiyon EC (ikinciFonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda y\u0131\u011f\u0131na eklenir)\n\/\/ 4. ikinciFonksiyon EC biter, y\u0131\u011f\u0131ndan \u00e7\u0131kar\n\/\/ 5. birinciFonksiyon EC biter, y\u0131\u011f\u0131ndan \u00e7\u0131kar\n\/\/ 6. Global EC biter (betik sona erdi\u011finde)\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu mekanizmay\u0131 anlamak, JavaScript'in de\u011fi\u015fkenlere nas\u0131l eri\u015fti\u011fini ve closure'lar\u0131n nas\u0131l olu\u015ftu\u011funu kavramak i\u00e7in temel bir ad\u0131md\u0131r.<\/p>\n<h2>Scope Zinciri ve De\u011fi\u015fken Eri\u015fimi Nas\u0131l \u0130\u015fler?<\/h2>\n<p>JavaScript'te kapsam (scope), de\u011fi\u015fkenlerin ve fonksiyonlar\u0131n nerede eri\u015filebilir oldu\u011funu belirleyen kurallar b\u00fct\u00fcn\u00fcd\u00fcr. Bu kurallar, kodumuzun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 do\u011frudan etkilerken, ayn\u0131 zamanda hatalar\u0131n \u00f6nlenmesine de yard\u0131mc\u0131 olur. JavaScript, s\u00f6zc\u00fcksel kapsamlamay\u0131 (lexical scoping) kullan\u0131r, yani de\u011fi\u015fkenlerin kapsam\u0131, kodun fiziksel olarak nerede yaz\u0131ld\u0131\u011f\u0131na g\u00f6re belirlenir, \u00e7al\u0131\u015fma zaman\u0131na g\u00f6re de\u011fil.<\/p>\n<p>JavaScript'te \u00fc\u00e7 ana kapsam t\u00fcr\u00fc bulunur:<\/p>\n<ul>\n<li><strong>Global Kapsam (Global Scope):<\/strong> Herhangi bir fonksiyonun veya blo\u011fun d\u0131\u015f\u0131nda tan\u0131mlanan de\u011fi\u015fkenler global kapsama aittir. Bu de\u011fi\u015fkenlere kodun herhangi bir yerinden eri\u015filebilir. Global kapsamda \u00e7ok fazla de\u011fi\u015fken tan\u0131mlamak, isim \u00e7ak\u0131\u015fmalar\u0131na ve uygulaman\u0131n genel sa\u011fl\u0131\u011f\u0131n\u0131n bozulmas\u0131na neden olabilir.<\/li>\n<li><strong>Fonksiyon Kapsam\u0131 (Function Scope):<\/strong> Bir fonksiyonun i\u00e7inde tan\u0131mlanan de\u011fi\u015fkenler (<code>var<\/code> ile) yaln\u0131zca o fonksiyon i\u00e7inde eri\u015filebilir. Fonksiyon d\u0131\u015f\u0131nda bu de\u011fi\u015fkenlere eri\u015fmeye \u00e7al\u0131\u015fmak bir referans hatas\u0131na yol a\u00e7ar. Bu, de\u011fi\u015fkenlerin fonksiyonun \u00f6mr\u00fcyle s\u0131n\u0131rl\u0131 kalmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Blok Kapsam\u0131 (Block Scope - ES6+):<\/strong> <code>let<\/code> ve <code>const<\/code> anahtar kelimeleri ile tan\u0131t\u0131lan bu kapsam t\u00fcr\u00fc, s\u00fcsl\u00fc parantez <code>{}<\/code> ile tan\u0131mlanan her blok i\u00e7inde ge\u00e7erlidir (\u00f6rne\u011fin, <code>if<\/code> bloklar\u0131, <code>for<\/code> d\u00f6ng\u00fcleri). Bu, de\u011fi\u015fkenlerin yaln\u0131zca tan\u0131mland\u0131klar\u0131 blok i\u00e7inde eri\u015filebilir oldu\u011fu anlam\u0131na gelir ve <code>var<\/code> ile gelen baz\u0131 beklenmedik davran\u0131\u015flar\u0131 ortadan kald\u0131r\u0131r.<\/li>\n<\/ul>\n<p><strong>Scope Zinciri (Scope Chain):<\/strong> Bir fonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda ve bir de\u011fi\u015fkene eri\u015fmeye \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda, JavaScript motoru belirli bir s\u0131rayla kapsamlar\u0131 kontrol eder. Bu s\u0131raya \"scope zinciri\" denir. JavaScript, de\u011fi\u015fkeni ilk olarak mevcut kapsamda arar. Bulamazsa, bir \u00fcst kapsama (yani, fonksiyonun tan\u0131mland\u0131\u011f\u0131 d\u0131\u015f kapsama) bakar. Bu i\u015flem, de\u011fi\u015fkeni bulana veya global kapsama ula\u015fana kadar devam eder. Global kapsamda da bulunamazsa, bir hata (<code>ReferenceError<\/code>) f\u0131rlat\u0131l\u0131r.<\/p>\n<pre><code>\nlet globalDegisken = \"Ben globalim\";\n\nfunction disFonksiyon() {\n  let disDegisken = \"Ben d\u0131\u015far\u0131day\u0131m\";\n\n  function icFonksiyon() {\n    let icDegisken = \"Ben i\u00e7erideyim\";\n    console.log(icDegisken);    \/\/ 'icDegisken' mevcut kapsamda bulunur\n    console.log(disDegisken);   \/\/ 'disDegisken' bir \u00fcst kapsamda bulunur\n    console.log(globalDegisken); \/\/ 'globalDegisken' en \u00fcst (global) kapsamda bulunur\n  }\n\n  icFonksiyon();\n  \/\/ console.log(icDegisken); \/\/ Hata! icDegisken burada tan\u0131ml\u0131 de\u011fil\n}\n\ndisFonksiyon();\n\/\/ console.log(disDegisken); \/\/ Hata! disDegisken burada tan\u0131ml\u0131 de\u011fil\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>icFonksiyon<\/code> kendi kapsam\u0131ndaki <code>icDegisken<\/code>'e, ard\u0131ndan tan\u0131mland\u0131\u011f\u0131 yer olan <code>disFonksiyon<\/code>'un kapsam\u0131ndaki <code>disDegisken<\/code>'e ve son olarak global kapsamdaki <code>globalDegisken<\/code>'e eri\u015febilir. Bu, s\u00f6zc\u00fcksel kapsamlaman\u0131n ve kapsam zincirinin temel \u00e7al\u0131\u015fma prensibidir.<\/p>\n<div class=\"uzman-ipucu\">\n        Uzman \u0130pucu: Kapsam zincirini iyi anlamak, \u00f6zellikle mod\u00fcl desenleri ve veri gizleme (data encapsulation) gibi ileri d\u00fczey programlama tekniklerini uygularken size b\u00fcy\u00fck avantaj sa\u011flar. De\u011fi\u015fkenleri yaln\u0131zca ihtiya\u00e7 duyulan kapsamda tan\u0131mlayarak bellek kullan\u0131m\u0131n\u0131 optimize edebilir ve kodunuzun yan etkilerini azaltabilirsiniz.\n    <\/div>\n<p><code>var<\/code>, <code>let<\/code> ve <code>const<\/code> aras\u0131ndaki farklar da bu ba\u011flamda olduk\u00e7a \u00f6nemlidir:<\/p>\n<ul>\n<li><code>var<\/code>: Fonksiyon kapsaml\u0131d\u0131r ve hoist edilir (yani, tan\u0131mlama yukar\u0131 ta\u015f\u0131n\u0131r, ancak de\u011fer atamas\u0131 yap\u0131lmaz). Bu da beklenmedik davran\u0131\u015flara yol a\u00e7abilir.<\/li>\n<li><code>let<\/code> ve <code>const<\/code>: Blok kapsaml\u0131d\u0131r ve hoist edilir ancak \"Temporal Dead Zone\" (TDZ) i\u00e7inde kal\u0131r. Yani, de\u011fi\u015fken tan\u0131mland\u0131\u011f\u0131 sat\u0131ra gelene kadar ona eri\u015fmeye \u00e7al\u0131\u015f\u0131rsan\u0131z hata al\u0131rs\u0131n\u0131z. Bu, daha \u00f6ng\u00f6r\u00fclebilir ve hatas\u0131z kod yazman\u0131za yard\u0131mc\u0131 olur.<\/li>\n<\/ul>\n<p>Bu temel farkl\u0131l\u0131klar\u0131 kavramak, daha modern ve g\u00fcvenli JavaScript yazmak i\u00e7in kritik bir ad\u0131md\u0131r.<\/p>\n<h2><code>this<\/code> Anahtar Kelimesinin Gizemi: <code>this<\/code> Nas\u0131l Belirlenir ve Neden \u00d6nemlidir?<\/h2>\n<p>JavaScript'teki <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a> anahtar kelimesi, \u00e7o\u011fu geli\u015ftiricinin kafas\u0131n\u0131 kar\u0131\u015ft\u0131ran, hatta deneyimli olanlar\u0131n bile zaman zaman hata yapmas\u0131na neden olan bir yap\u0131d\u0131r. <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>, bir fonksiyonun \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 anki ba\u011flama g\u00f6re de\u011ferini dinamik olarak de\u011fi\u015ftiren bir referanst\u0131r. Yani, <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'in de\u011feri, fonksiyonun <em>nas\u0131l<\/em> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r, <em>nerede<\/em> tan\u0131mland\u0131\u011f\u0131na de\u011fil (arrow fonksiyonlar\u0131 hari\u00e7).<\/p>\n<p><code>this<\/code>'in de\u011ferini belirleyen temel kurallar \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>Global Ba\u011flamda <code>this<\/code>:<\/strong> Global kapsamda (<a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a> bir fonksiyonun i\u00e7inde de\u011filken), <code>this<\/code> her zaman global objeyi referans al\u0131r. Taray\u0131c\u0131da bu <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/API\/Window\" target=\"_blank\"><code>window<\/code><\/a> objesi, Node.js'te ise <a href=\"https:\/\/nodejs.org\/api\/globals.html#global\" target=\"_blank\"><code>global<\/code><\/a> objesidir.<\/li>\n<li><strong>Metot \u00c7a\u011fr\u0131s\u0131nda <code>this<\/code>:<\/strong> Bir fonksiyon bir objenin metodu olarak \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda (\u00f6rne\u011fin, <code>obj.metot()<\/code>), <code>this<\/code> o objeyi referans al\u0131r.\n<pre><code>\nconst kullanici = {\n  ad: \"Ali\",\n  selamla: function() {\n    console.log(\"Merhaba, ben \" + this.ad);\n  }\n};\nkullanici.selamla(); \/\/ \u00c7\u0131kt\u0131: Merhaba, ben Ali (this -> kullanici objesi)\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li><strong>Basit Fonksiyon \u00c7a\u011fr\u0131s\u0131nda <code>this<\/code>:<\/strong> Bir fonksiyon ba\u011f\u0131ms\u0131z olarak \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda (yani, bir obje \u00fczerinden de\u011fil, \u00f6rne\u011fin <code>fonksiyonAdi()<\/code>), kat\u0131 modda (<code>&#039;use strict&#039;<\/code>) <code>this<\/code> <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/undefined\" target=\"_blank\"><code>undefined<\/code><\/a> olur. Kat\u0131 mod d\u0131\u015f\u0131nda ise global objeye (<a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/API\/Window\" target=\"_blank\"><code>window<\/code><\/a>) i\u015faret eder. Bu, genellikle istenmeyen bir durumdur ve en yayg\u0131n <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a> hatalar\u0131ndan birine yol a\u00e7ar.\n<pre><code>\nfunction selamVer() {\n  console.log(\"Merhaba, ben \" + this.ad);\n}\nconst kullanici2 = { ad: \"Ay\u015fe\" };\nselamVer(); \/\/ 'use strict' yoksa: Merhaba, ben undefined (this -> window)\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li><strong>Kurucu Fonksiyon (Constructor) \u00c7a\u011fr\u0131s\u0131nda <code>this<\/code>:<\/strong> Bir fonksiyon <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/new\" target=\"_blank\"><code>new<\/code><\/a> anahtar kelimesiyle \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, o bir kurucu fonksiyon haline gelir ve <code>this<\/code> yeni olu\u015fturulan objeyi referans al\u0131r.\n<pre><code>\nfunction Kisi(ad) {\n  this.ad = ad;\n}\nconst yeniKisi = new Kisi(\"Can\");\nconsole.log(yeniKisi.ad); \/\/ \u00c7\u0131kt\u0131: Can (this -> yeniKisi objesi)\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li><strong>A\u00e7\u0131k Ba\u011flama (Explicit Binding):<\/strong> <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Function\/call\" target=\"_blank\"><code>call()<\/code><\/a>, <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Function\/apply\" target=\"_blank\"><code>apply()<\/code><\/a> ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Function\/bind\" target=\"_blank\"><code>bind()<\/code><\/a> metotlar\u0131 ile <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'in de\u011ferini manuel olarak ayarlayabiliriz.\n<ul>\n<li><code>call()<\/code> ve <code>apply()<\/code>: Fonksiyonu hemen \u00e7al\u0131\u015ft\u0131r\u0131r ve ilk arg\u00fcman olarak <code>this<\/code>'in referans edece\u011fi objeyi al\u0131r. <code>call()<\/code> arg\u00fcmanlar\u0131 ayr\u0131 ayr\u0131 al\u0131rken, <code>apply()<\/code> arg\u00fcmanlar\u0131 bir dizi olarak al\u0131r.<\/li>\n<li><code>bind()<\/code>: Fonksiyonu hemen \u00e7al\u0131\u015ft\u0131rmaz, ancak <code>this<\/code> de\u011feri sabitlenmi\u015f (ba\u011flanm\u0131\u015f) yeni bir fonksiyon d\u00f6nd\u00fcr\u00fcr. Bu, \u00f6zellikle olay dinleyicilerinde veya asenkron callback'lerde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.\n<pre><code>\nfunction selamVerExplicit(selam) {\n  console.log(selam + \", ben \" + this.ad);\n}\nconst person = { ad: \"Deniz\" };\nselamVerExplicit.call(person, \"Merhaba\"); \/\/ Merhaba, ben Deniz\nconst bagliSelamVer = selamVerExplicit.bind(person, \"Merhaba\");\nbagliSelamVer(); \/\/ Merhaba, ben Deniz\n                    <\/pre>\n<p><\/code>\n                <\/li>\n<\/ul>\n<\/li>\n<li><strong>Arrow Fonksiyonlarda <code>this<\/code>:<\/strong> ES6 ile gelen ok fonksiyonlar\u0131, <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'in nas\u0131l davrand\u0131\u011f\u0131 konusunda devrim niteli\u011findedir. Arrow fonksiyonlar kendi <code>this<\/code> ba\u011flam\u0131n\u0131 olu\u015fturmazlar; bunun yerine, tan\u0131mland\u0131klar\u0131 s\u00f6zc\u00fcksel ortamdaki <code>this<\/code> de\u011ferini miras al\u0131rlar. Bu, onlar\u0131 \u00f6zellikle callback fonksiyonlar\u0131 i\u00e7in ideal k\u0131lar ve yukar\u0131daki \"basit fonksiyon \u00e7a\u011fr\u0131s\u0131\" kaynakl\u0131 hatalar\u0131 \u00f6nler.\n<pre><code>\nconst kullanici3 = {\n  ad: \"Zeynep\",\n  selamla: function() {\n    setTimeout(() => {\n      console.log(\"Merhaba, ben \" + this.ad); \/\/ this -> kullanici3 objesi\n    }, 100);\n  }\n};\nkullanici3.selamla(); \/\/ \u00c7\u0131kt\u0131: Merhaba, ben Zeynep\n            <\/pre>\n<p><\/code><\/p>\n<p>E\u011fer <code>setTimeout<\/code> i\u00e7inde normal bir fonksiyon kullansayd\u0131k, <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a> muhtemelen global objeye veya <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/undefined\" target=\"_blank\"><code>undefined<\/code><\/a>'a i\u015faret edecekti.<\/p>\n<\/li>\n<\/ol>\n<p><code>this<\/code>'in nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kavramak, \u00f6zellikle olay dinleyicileri, s\u0131n\u0131f tabanl\u0131 yap\u0131lar ve modern JavaScript \u00e7er\u00e7eveleriyle \u00e7al\u0131\u015f\u0131rken hayati \u00f6neme sahiptir. Bu bilgi, beklenmedik davran\u0131\u015flar\u0131 \u00f6nlemenin ve daha g\u00fcvenilir kod yazman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h2>Pratik Uygulamalar: Ba\u011flam Bilgisiyle Kodunuzu Nas\u0131l Optimize Edebilirsiniz?<\/h2>\n<p>Y\u00fcr\u00fctme ba\u011flam\u0131n\u0131, kapsam\u0131 ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a> anahtar kelimesini anlamak sadece teorik bir bilgi y\u0131\u011f\u0131n\u0131 de\u011fildir; ayn\u0131 zamanda g\u00fcnl\u00fck kodlama pratiklerinizde size somut faydalar sa\u011flayacak g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Bu bilgiyi kullanarak kodunuzu daha optimize, daha az hataya a\u00e7\u0131k ve daha mod\u00fcler hale getirebilirsiniz.<\/p>\n<h3>Event Handler'larda <code>this<\/code> Y\u00f6netimi<\/h3>\n<p>Frontend geli\u015ftirmede en s\u0131k kar\u015f\u0131la\u015f\u0131lan senaryolardan biri, bir DOM eleman\u0131na olay dinleyici (event listener) eklemektir. Bir\u00e7ok durumda, olay dinleyici i\u00e7indeki <code>this<\/code>, olay\u0131n ger\u00e7ekle\u015fti\u011fi DOM eleman\u0131na i\u015faret eder. Ancak bir s\u0131n\u0131f metodunu do\u011frudan event handler olarak atad\u0131\u011f\u0131n\u0131zda, <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'in s\u0131n\u0131f \u00f6rne\u011fi yerine DOM eleman\u0131na i\u015faret etmesiyle kar\u015f\u0131la\u015fabilirsiniz. \u0130\u015fte bu noktada <code>bind()<\/code> metodunun veya arrow fonksiyonlar\u0131n\u0131n g\u00fcc\u00fc devreye girer.<\/p>\n<pre><code>\nclass Sayac {\n  constructor() {\n    this.sayi = 0;\n    this.buton = document.createElement('button');\n    this.buton.textContent = <code>Say\u0131m: ${this.sayi}<\/code>;\n    document.body.appendChild(this.buton);\n\n    \/\/ Yanl\u0131\u015f Yakla\u015f\u0131m: 'this' buton objesini i\u015faret eder\n    \/\/ this.buton.addEventListener('click', this.artir);\n\n    \/\/ Do\u011fru Yakla\u015f\u0131m 1: bind() ile 'this'i sabitlemek\n    \/\/ this.buton.addEventListener('click', this.artir.bind(this));\n\n    \/\/ Do\u011fru Yakla\u015f\u0131m 2: Arrow fonksiyonu ile 'this'i miras almak\n    this.buton.addEventListener('click', () => this.artir());\n  }\n\n  artir() {\n    this.sayi++;\n    this.buton.textContent = <code>Say\u0131m: ${this.sayi}<\/code>;\n    console.log(\"Mevcut Say\u0131:\", this.sayi);\n  }\n}\n\nnew Sayac();\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>artir<\/code> metodu bir s\u0131n\u0131f metodudur. E\u011fer do\u011frudan <code>this.buton.addEventListener('click', this.artir);<\/code> \u015feklinde \u00e7a\u011f\u0131r\u0131rsak, <code>artir<\/code> i\u00e7indeki <code>this<\/code>, <code>buton<\/code> DOM eleman\u0131n\u0131 g\u00f6sterecektir, bu da <code>this.sayi<\/code>'nin <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/undefined\" target=\"_blank\"><code>undefined<\/code><\/a> olmas\u0131na neden olur. Ancak <code>bind(this)<\/code> kullanarak veya bir arrow fonksiyonu i\u00e7inde \u00e7a\u011f\u0131rarak, <code>artir<\/code> metodu i\u00e7indeki <code>this<\/code>'in <code>Sayac<\/code> s\u0131n\u0131f\u0131n\u0131n \u00f6rne\u011fini do\u011fru bir \u015fekilde referans almas\u0131n\u0131 sa\u011flayabiliriz.<\/p>\n<h3>Mod\u00fcl Desenleri ve Veri Gizleme<\/h3>\n<p>Ba\u011flam ve kapsam bilgisi, \u00f6zellikle b\u00fcy\u00fck uygulamalarda kodun mod\u00fclerli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131ran desenlerin olu\u015fturulmas\u0131nda anahtar rol oynar. Mod\u00fcl Deseni, \u00f6zel (private) de\u011fi\u015fkenleri ve fonksiyonlar\u0131 olu\u015fturmak i\u00e7in closure'lar\u0131 ve dolay\u0131s\u0131yla ba\u011flam bilgisini kullan\u0131r.<\/p>\n<pre><code>\nconst sayacModulu = (function() {\n  let _sayi = 0; \/\/ \u00d6zel (private) de\u011fi\u015fken - d\u0131\u015far\u0131dan do\u011frudan eri\u015filemez\n\n  function artir() {\n    _sayi++;\n    console.log(\"Art\u0131r\u0131ld\u0131:\", _sayi);\n  }\n\n  function azalt() {\n    _sayi--;\n    console.log(\"Azalt\u0131ld\u0131:\", _sayi);\n  }\n\n  function gecerliDeger() {\n    return _sayi;\n  }\n\n  return { \/\/ Public aray\u00fcz\n    artir: artir,\n    azalt: azalt,\n    deger: gecerliDeger\n  };\n})();\n\nsayacModulu.artir(); \/\/ Art\u0131r\u0131ld\u0131: 1\nsayacModulu.artir(); \/\/ Art\u0131r\u0131ld\u0131: 2\nconsole.log(sayacModulu.deger()); \/\/ 2\n\/\/ console.log(sayacModulu._sayi); \/\/ undefined - _sayi d\u0131\u015far\u0131dan eri\u015filemez\n\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu <a href=\"https:\/\/en.wikipedia.org\/wiki\/Module_pattern\" target=\"_blank\">\"Immediately Invoked Function Expression\" (IIFE)<\/a> deseni, <code>_sayi<\/code> de\u011fi\u015fkenini d\u0131\u015f fonksiyonun kapsam\u0131 i\u00e7inde tutar. D\u0131\u015f fonksiyon \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131ktan sonra bile, <code>artir<\/code>, <code>azalt<\/code> ve <code>gecerliDeger<\/code> fonksiyonlar\u0131 bu <code>_sayi<\/code> de\u011fi\u015fkenine eri\u015febilir \u00e7\u00fcnk\u00fc closure olu\u015fturmu\u015flard\u0131r. Bu, d\u0131\u015f d\u00fcnyaya sadece ihtiyac\u0131m\u0131z olan aray\u00fcz\u00fc sunarken, i\u00e7 detaylar\u0131 g\u00fcvende tutmam\u0131z\u0131 sa\u011flar. Bu, do\u011frudan closure'lar\u0131n bir uygulamas\u0131d\u0131r, ancak temeli kapsam (scope) bilgisidir.<\/p>\n<p><strong>Bellek Y\u00f6netimi ve Performans:<\/strong> Ba\u011flam bilgisi, performans optimizasyonlar\u0131nda da etkilidir. \u00d6rne\u011fin, gereksiz closure'lar olu\u015fturmaktan ka\u00e7\u0131narak veya b\u00fcy\u00fck objeleri global kapsamda tutmaktan vazge\u00e7erek bellek kullan\u0131m\u0131n\u0131 azaltabilirsiniz. De\u011fi\u015fkenlerin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc ve eri\u015filebilirli\u011fini do\u011fru bir \u015fekilde y\u00f6netmek, \u00f6zellikle uzun \u00f6m\u00fcrl\u00fc uygulamalarda kaynak kullan\u0131m\u0131n\u0131 optimize etmek i\u00e7in hayati \u00f6neme sahiptir. Kapsam d\u0131\u015f\u0131na \u00e7\u0131kan referanslar\u0131 d\u00fczg\u00fcn bir \u015fekilde temizlemek, \u00e7\u00f6p toplay\u0131c\u0131n\u0131n (garbage collector) i\u015fini kolayla\u015ft\u0131r\u0131r ve bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler.<\/p>\n<div class=\"uzman-ipucu\">\n        Uzman \u0130pucu: Bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in, \u00f6zellikle DOM elementlerine eklenen event listener'lar\u0131 tek kullan\u0131ml\u0131k fonksiyonlarda veya ilgili element DOM'dan kald\u0131r\u0131ld\u0131\u011f\u0131nda temizlemeyi (<code>removeEventListener<\/code>) unutmay\u0131n. Aksi takdirde, fonksiyonlar ve dolay\u0131s\u0131yla ba\u011fl\u0131 olduklar\u0131 d\u0131\u015f ba\u011flamlar bellekte gereksiz yere tutulmaya devam edebilir.\n    <\/div>\n<p>Bu pratik uygulamalar, ba\u011flam bilgisinin sadece soyut bir kavram olmad\u0131\u011f\u0131n\u0131, ayn\u0131 zamanda g\u00fcnl\u00fck kodlama m\u00fccadelelerinizde size nas\u0131l somut avantajlar sa\u011flayabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bu temel mekanizmalar\u0131 sa\u011flam bir \u015fekilde kavrad\u0131\u011f\u0131n\u0131zda, daha ileri d\u00fczey konulara (closure'lar gibi) \u00e7ok daha rahat bir \u015fekilde adapte olabilirsiniz.<\/p>\n<h2>\u0130leri D\u00fczey Kavramlar: Ba\u011flam Manip\u00fclasyonu ve Yayg\u0131n Hatalardan Ka\u00e7\u0131nma<\/h2>\n<p>Temel y\u00fcr\u00fctme ba\u011flam\u0131, kapsam ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a> kavramlar\u0131n\u0131 anlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi bu bilgiyi kullanarak daha karma\u015f\u0131k senaryolar\u0131 nas\u0131l y\u00f6netece\u011fimize ve yayg\u0131n tuzaklardan nas\u0131l ka\u00e7\u0131naca\u011f\u0131m\u0131za odaklanal\u0131m. JavaScript'in dinamik yap\u0131s\u0131, ba\u011flam\u0131 manip\u00fcle etme esnekli\u011fi sunarken, ayn\u0131 zamanda dikkatli olunmazsa beklenmedik sorunlara yol a\u00e7abilir.<\/p>\n<h3>Kapsam D\u0131\u015f\u0131 De\u011fi\u015fken Eri\u015fimi ve Hata Ay\u0131klama<\/h3>\n<p>Daha \u00f6nce bahsetti\u011fimiz kapsam zinciri, de\u011fi\u015fkenlere eri\u015fim kurallar\u0131n\u0131 belirler. Ancak bazen, bir de\u011fi\u015fkene eri\u015fmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131zda, o de\u011fi\u015fkenin mevcut kapsamda veya kapsam zincirinde olmad\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcr\u00fcz ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Errors\/ReferenceError\" target=\"_blank\"><code>ReferenceError<\/code><\/a> ile kar\u015f\u0131la\u015f\u0131r\u0131z. Bu genellikle de\u011fi\u015fkenin yanl\u0131\u015f kapsamda tan\u0131mlanmas\u0131ndan veya eri\u015filmeye \u00e7al\u0131\u015f\u0131lan fonksiyonun beklenen ba\u011flamdan farkl\u0131 bir yerde \u00e7a\u011fr\u0131lmas\u0131ndan kaynaklan\u0131r.<\/p>\n<pre><code>\nfunction birIslemYap() {\n  let deger = \"\u00d6nemli Veri\";\n  setTimeout(function() {\n    \/\/ console.log(deger); \/\/ Buras\u0131 \u00e7al\u0131\u015f\u0131r m\u0131?\n  }, 1000);\n}\n\n\/\/ Bir d\u0131\u015f fonksiyonu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fczde:\nfunction disFonksiyon() {\n  let x = 10;\n  \/\/ Burada y'ye eri\u015fmeye \u00e7al\u0131\u015fmak hata verir, \u00e7\u00fcnk\u00fc y sadece icFonksiyon i\u00e7inde tan\u0131ml\u0131d\u0131r.\n  \/\/ console.log(y); \/\/ ReferenceError\n  function icFonksiyon() {\n    let y = 20;\n    console.log(x); \/\/ x'e eri\u015fim m\u00fcmk\u00fcn, \u00e7\u00fcnk\u00fc d\u0131\u015f kapsamda\n  }\n  icFonksiyon();\n}\ndisFonksiyon();\n    <\/pre>\n<p><\/code><\/p>\n<p><code>setTimeout<\/code> \u00f6rne\u011finde, anonim fonksiyon bir closure olu\u015fturdu\u011fu i\u00e7in <code>deger<\/code> de\u011fi\u015fkenine eri\u015febilir. Ancak, e\u011fer <code>deger<\/code> ba\u015fka bir fonksiyonda tan\u0131ml\u0131 olsayd\u0131 ve o fonksiyonun y\u00fcr\u00fctmesi tamamland\u0131ysa, eri\u015fim m\u00fcmk\u00fcn olmazd\u0131. Bu durumlar\u0131 hata ay\u0131klarken, geli\u015ftirici ara\u00e7lar\u0131ndaki (Chrome DevTools gibi) \"Scope\" panelini kullanarak o anki y\u00fcr\u00fctme ba\u011flam\u0131ndaki ve kapsam zincirindeki de\u011fi\u015fkenleri incelemek \u00e7ok faydal\u0131d\u0131r. Bu panel, o anda hangi de\u011fi\u015fkenlerin eri\u015filebilir oldu\u011funu ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'in neyi g\u00f6sterdi\u011fini a\u00e7\u0131k\u00e7a g\u00f6sterir.<\/p>\n<h3><code>try...catch<\/code> Bloklar\u0131 ve Ba\u011flam\u0131n Etkisi<\/h3>\n<p><a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Statements\/try...catch\" target=\"_blank\"><code>try...catch<\/code><\/a> bloklar\u0131, hata y\u00f6netimi i\u00e7in hayati \u00f6neme sahiptir. Bir hata yakaland\u0131\u011f\u0131nda, <code>catch<\/code> blo\u011fu i\u00e7inde farkl\u0131 bir y\u00fcr\u00fctme ba\u011flam\u0131na girebilirsiniz. \u00d6zellikle asenkron kodlarda (<a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Promise\" target=\"_blank\"><code>Promise<\/code><\/a>'ler veya <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Statements\/async_function\" target=\"_blank\"><code>async\/await<\/code><\/a>) hatalar\u0131 do\u011fru bir \u015fekilde ele almak i\u00e7in, hatan\u0131n olu\u015ftu\u011fu ba\u011flam\u0131 anlamak ve bu ba\u011flamdan bilgi alabilmek \u00f6nemlidir. Hata objeleri genellikle y\u0131\u011f\u0131n izlemesi (stack trace) i\u00e7erir, bu da hatan\u0131n \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131nda nerede meydana geldi\u011fini g\u00f6sterir ve ba\u011flam\u0131 analiz etmede yard\u0131mc\u0131 olur.<\/p>\n<h3>Mobil Uyumlu Geli\u015ftirme ve Ba\u011flam Y\u00f6netimi<\/h3>\n<p>Web uygulamalar\u0131m\u0131z\u0131n mobil cihazlarda da sorunsuz \u00e7al\u0131\u015fmas\u0131, g\u00fcn\u00fcm\u00fcz\u00fcn vazge\u00e7ilmez bir gereksinimidir. Mobil cihazlar\u0131n k\u0131s\u0131tl\u0131 i\u015flem g\u00fcc\u00fc ve bellek kaynaklar\u0131, ba\u011flam y\u00f6netimini daha da kritik hale getirir. Gereksiz closure'lar veya b\u00fcy\u00fck objeleri uzun s\u00fcre bellekte tutan referanslar, mobil cihazlarda performans d\u00fc\u015f\u00fc\u015flerine ve hatta uygulaman\u0131n \u00e7\u00f6kmesine yol a\u00e7abilir. <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/CSS\/Media_Queries\" target=\"_blank\">Media query<\/a>'ler gibi responsive tasar\u0131m ara\u00e7lar\u0131 UI taraf\u0131nda devreye girerken, JavaScript taraf\u0131nda da ba\u011flam\u0131 etkin y\u00f6netmek gerekir. \u00d6rne\u011fin:<\/p>\n<ul>\n<li>B\u00fcy\u00fck data setleri ile \u00e7al\u0131\u015f\u0131rken, veriyi k\u00fc\u00e7\u00fck par\u00e7alara b\u00f6lmek ve sadece ihtiyac\u0131m\u0131z oldu\u011funda y\u00fcklemek (lazy loading), bellek kullan\u0131m\u0131n\u0131 azalt\u0131r.<\/li>\n<li>Olay dinleyicilerini, component'ler DOM'dan kald\u0131r\u0131ld\u0131\u011f\u0131nda veya kullan\u0131lmad\u0131\u011f\u0131nda temizlemek, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler.<\/li>\n<li>Animasyonlar ve s\u0131k\u00e7a tetiklenen olaylar (scroll, resize) i\u00e7in <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/API\/Window\/requestAnimationFrame\" target=\"_blank\"><code>requestAnimationFrame<\/code><\/a>, <a href=\"https:\/\/lodash.com\/docs\/4.17.15#throttle\" target=\"_blank\"><code>throttle<\/code><\/a> veya <a href=\"https:\/\/lodash.com\/docs\/4.17.15#debounce\" target=\"_blank\"><code>debounce<\/code><\/a> gibi teknikleri kullanarak fonksiyon \u00e7a\u011fr\u0131lar\u0131n\u0131n ve dolay\u0131s\u0131yla yeni y\u00fcr\u00fctme ba\u011flamlar\u0131n\u0131n say\u0131s\u0131n\u0131 s\u0131n\u0131rlamak, mobil cihazlarda ak\u0131c\u0131 bir kullan\u0131c\u0131 deneyimi sa\u011flar.<\/li>\n<\/ul>\n<p>Ba\u011flam\u0131n derinlemesine anla\u015f\u0131lmas\u0131, sadece kodunuzun do\u011frulu\u011funu art\u0131rmakla kalmaz, ayn\u0131 zamanda uygulaman\u0131z\u0131n performans\u0131n\u0131 ve genel sa\u011fl\u0131\u011f\u0131n\u0131 da do\u011frudan etkiler. Bu ileri d\u00fczey kavramlar, sizi daha yetkin bir JavaScript geli\u015ftiricisi haline getirecek ve karma\u015f\u0131k sorunlarla ba\u015fa \u00e7\u0131kma yetene\u011finizi g\u00fc\u00e7lendirecektir.<\/p>\n<h2>Closure'lara Haz\u0131r M\u0131s\u0131n\u0131z? Temelleri Sa\u011flamla\u015ft\u0131rman\u0131n \u00d6nemi<\/h2>\n<p>Bu makale boyunca, JavaScript'in y\u00fcr\u00fctme ba\u011flam\u0131, kapsam (scope) zinciri ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a> anahtar kelimesinin inceliklerini ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceledik. Art\u0131k biliyorsunuz ki, bir fonksiyonun veya de\u011fi\u015fkenin davran\u0131\u015f\u0131n\u0131 belirleyen sadece yazd\u0131\u011f\u0131n\u0131z kod de\u011fil, ayn\u0131 zamanda o kodun hangi \u00e7evrede ve hangi ko\u015fullar alt\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131d\u0131r. Bu temel kavramlar, JavaScript'in \u00e7al\u0131\u015fma mekanizmas\u0131n\u0131n omurgas\u0131n\u0131 olu\u015fturur ve bu omurgay\u0131 sa\u011flam bir \u015fekilde anlamak, daha karma\u015f\u0131k yap\u0131 ta\u015flar\u0131n\u0131, \u00f6zellikle de closure'lar\u0131 do\u011fru bir \u015fekilde kavraman\u0131n \u00f6n ko\u015fuludur.<\/p>\n<p>Closure'lar, asl\u0131nda kapsam zincirinin ve fonksiyonlar\u0131n kendi olu\u015fturulduklar\u0131 s\u00f6zc\u00fcksel ortam\u0131 \"hat\u0131rlama\" yetene\u011finin do\u011fal bir sonucudur. Bir fonksiyon, kendi d\u0131\u015f kapsam\u0131ndaki de\u011fi\u015fkenlere, d\u0131\u015f fonksiyonun y\u00fcr\u00fctmesi sona ermi\u015f olsa bile eri\u015febiliyorsa, bu bir closure'd\u0131r. Bu yetenek, veri gizleme, durum y\u00f6netimi, currying gibi bir\u00e7ok g\u00fc\u00e7l\u00fc programlama desenine olanak tan\u0131r. Ancak, bu sihirli yap\u0131larla \u00e7al\u0131\u015f\u0131rken, ba\u011flam\u0131n nas\u0131l de\u011fi\u015fti\u011fini ve de\u011fi\u015fkenlerin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc g\u00f6z ard\u0131 etmek, kolayca bellek s\u0131z\u0131nt\u0131lar\u0131na veya beklenmeyen davran\u0131\u015flara yol a\u00e7abilir.<\/p>\n<p>\u00d6zetle, JavaScript'in kalbindeki bu temel mekanizmalar\u0131 sa\u011flam bir \u015fekilde \u00f6\u011frenmek, sadece closure'lar\u0131 de\u011fil, ayn\u0131 zamanda Promise'ler, async\/await, mod\u00fcl sistemleri, hatta React veya Vue gibi modern k\u00fct\u00fcphanelerdeki state y\u00f6netimi gibi ileri d\u00fczey konular\u0131 da daha derinlemesine anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Art\u0131k closure'lara giden yolda sa\u011flam bir temele sahipsiniz. Bu bilgiyi kullanarak, daha temiz, daha verimli ve daha profesyonel JavaScript kodlar\u0131 yazmaya haz\u0131rs\u0131n\u0131z!<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular: Ba\u011flam Hakk\u0131nda Merak Edilenler<\/h2>\n<p>\u0130\u015fte JavaScript ba\u011flam\u0131 hakk\u0131nda en s\u0131k kar\u015f\u0131la\u015f\u0131lan baz\u0131 sorular ve cevaplar\u0131:<\/p>\n<dl>\n<dt><strong>1. \"Execution Context\" ve \"Lexical Environment\" aras\u0131ndaki temel fark nedir?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> Y\u00fcr\u00fctme Ba\u011flam\u0131 (Execution Context), kodun \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 genel soyut bir ortamd\u0131r ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a> ba\u011flam\u0131, de\u011fi\u015fken ortam\u0131 ve s\u00f6zc\u00fcksel ortam\u0131 i\u00e7erir. S\u00f6zc\u00fcksel Ortam (Lexical Environment) ise, bu y\u00fcr\u00fctme ba\u011flam\u0131n\u0131n bir bile\u015fenidir ve kodun fiziksel olarak yaz\u0131ld\u0131\u011f\u0131 yere g\u00f6re de\u011fi\u015fkenlerin ve fonksiyonlar\u0131n kapsam\u0131n\u0131 (yani hangi verilere eri\u015filebilece\u011fini) belirleyen bir yap\u0131d\u0131r. Bir y\u00fcr\u00fctme ba\u011flam\u0131 i\u00e7inde bir veya daha fazla s\u00f6zc\u00fcksel ortam bulunabilir.<\/dd>\n<dt><strong>2. <code>var<\/code>, <code>let<\/code> ve <code>const<\/code> neden farkl\u0131 kapsam davran\u0131\u015flar\u0131 g\u00f6sterir?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> <code>var<\/code> fonksiyon kapsaml\u0131d\u0131r ve hoist edilir (tan\u0131mlamas\u0131 en \u00fcste ta\u015f\u0131n\u0131r), bu da bazen beklenmeyen davran\u0131\u015flara yol a\u00e7ar. <code>let<\/code> ve <code>const<\/code> ise ES6 ile gelmi\u015f olup blok kapsaml\u0131d\u0131rlar. Ayr\u0131ca, hoist edilirler ancak \"Temporal Dead Zone\" (TDZ) i\u00e7inde kal\u0131rlar; yani tan\u0131mland\u0131klar\u0131 sat\u0131ra gelmeden eri\u015filmeye \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda hata verirler. <code>const<\/code> ek olarak bir kez atand\u0131ktan sonra de\u011feri de\u011fi\u015ftirilemez.<\/dd>\n<dt><strong>3. Bir fonksiyon i\u00e7inde <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'in de\u011ferini nas\u0131l kesin olarak bilebilirim?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'in de\u011feri, fonksiyonun nas\u0131l \u00e7a\u011fr\u0131ld\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r. Genel kurallar \u015funlard\u0131r: metot \u00e7a\u011fr\u0131s\u0131nda objeyi, basit fonksiyon \u00e7a\u011fr\u0131s\u0131nda (kat\u0131 modda) <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/undefined\" target=\"_blank\"><code>undefined<\/code><\/a>'\u0131 (aksi halde <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/API\/Window\" target=\"_blank\"><code>window<\/code><\/a>'u), kurucu \u00e7a\u011fr\u0131s\u0131nda yeni objeyi i\u015faret eder. Arrow fonksiyonlar\u0131 ise <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'i tan\u0131mland\u0131klar\u0131 s\u00f6zc\u00fcksel ortamdan miras al\u0131r. <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Function\/call\" target=\"_blank\"><code>call()<\/code><\/a>, <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Function\/apply\" target=\"_blank\"><code>apply()<\/code><\/a> ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Function\/bind\" target=\"_blank\"><code>bind()<\/code><\/a> metotlar\u0131 ile <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'i manuel olarak ba\u011flayabilirsiniz.<\/dd>\n<dt><strong>4. Closure'lar bellek s\u0131z\u0131nt\u0131lar\u0131na neden olabilir mi?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> Evet, yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda closure'lar bellek s\u0131z\u0131nt\u0131lar\u0131na neden olabilir. E\u011fer bir closure, d\u0131\u015f kapsam\u0131ndaki b\u00fcy\u00fck bir objeye veya DOM elementine gereksiz yere uzun s\u00fcre referans tutarsa, bu objenin \u00e7\u00f6p toplay\u0131c\u0131 taraf\u0131ndan temizlenmesini engeller. Bu durum, \u00f6zellikle tek kullan\u0131ml\u0131k event listener'lar veya asenkron callback'lerde dikkat edilmesi gereken bir durumdur.<\/dd>\n<dt><strong>5. Neden \"Strict Mode\" (Kat\u0131 Mod) kullanmal\u0131y\u0131m?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> Kat\u0131 mod (<code>&#039;use strict&#039;;<\/code>), JavaScript kodunuzda g\u00fcvenli olmayan i\u015flemleri yasaklar ve hata ay\u0131klamay\u0131 kolayla\u015ft\u0131ran baz\u0131 hatalar\u0131 (\u00f6rne\u011fin, tan\u0131mlanmam\u0131\u015f de\u011fi\u015fken kullan\u0131m\u0131) ortaya \u00e7\u0131kar\u0131r. En \u00f6nemlisi, kat\u0131 modda ba\u011f\u0131ms\u0131z \u00e7a\u011fr\u0131lan fonksiyonlarda <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a>'i global obje yerine <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/undefined\" target=\"_blank\"><code>undefined<\/code><\/a> olarak ayarlar, bu da beklenmedik global de\u011fi\u015fken olu\u015fturma gibi yan etkileri \u00f6nler ve <a href=\"https:\/\/developer.mozilla.org\/tr\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\">'this'<\/a> y\u00f6netiminizi daha \u00f6ng\u00f6r\u00fclebilir k\u0131lar.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"JavaScript d\u00fcnyas\u0131na yeni ad\u0131m atanlar veya tecr\u00fcbeli geli\u015ftiriciler i\u00e7in closure&#8217;lar, ba\u015flang\u0131\u00e7ta gizemli ve karma\u015f\u0131k g\u00f6r\u00fcnebilir. Ancak endi\u015felenmeyin, bu&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-33050","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Closure \u00d6ncesi Ba\u011flam: JavaScript&#039;in Kalbine Bir Yolculuk<\/title>\n<meta name=\"description\" content=\"JavaScript d\u00fcnyas\u0131na yeni ad\u0131m atanlar veya tecr\u00fcbeli geli\u015ftiriciler i\u00e7in closure&#039;lar, ba\u015flang\u0131\u00e7ta gizemli ve karma\u015f\u0131k g\u00f6r\u00fcnebilir. Ancak endi\u015felenmeyin, bu \u201csihirli\u201d yap\u0131lar asl\u0131nda JavaScript&#039;in temel mekanizmalar\u0131n\u0131n do\u011fal bir sonucudur. Closure&#039;lar\u0131 tam anlam\u0131yla kavrayabilmek i\u00e7in, \u00f6ncelikle JavaScript&#039;in y\u00fcr\u00fctme ba\u011flam\u0131, kapsam (scope) ve &#039;this&#039; anahtar kelimesinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine anlamak kritik \u00f6nem ta\u015f\u0131r. Bu kapsaml\u0131 rehberde, kodunuzun derinliklerine inerek, ba\u011flam kavram\u0131n\u0131n inceliklerini ad\u0131m ad\u0131m ke\u015ffedecek ve b\u00f6ylece closure&#039;lara sa\u011flam bir zemin haz\u0131rlayaca\u011f\u0131z.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Closure \u00d6ncesi Ba\u011flam: JavaScript&#039;in Kalbine Bir Yolculuk\" \/>\n<meta property=\"og:description\" content=\"JavaScript d\u00fcnyas\u0131na yeni ad\u0131m atanlar veya tecr\u00fcbeli geli\u015ftiriciler i\u00e7in closure&#039;lar, ba\u015flang\u0131\u00e7ta gizemli ve karma\u015f\u0131k g\u00f6r\u00fcnebilir. Ancak endi\u015felenmeyin, bu \u201csihirli\u201d yap\u0131lar asl\u0131nda JavaScript&#039;in temel mekanizmalar\u0131n\u0131n do\u011fal bir sonucudur. Closure&#039;lar\u0131 tam anlam\u0131yla kavrayabilmek i\u00e7in, \u00f6ncelikle JavaScript&#039;in y\u00fcr\u00fctme ba\u011flam\u0131, kapsam (scope) ve &#039;this&#039; anahtar kelimesinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine anlamak kritik \u00f6nem ta\u015f\u0131r. Bu kapsaml\u0131 rehberde, kodunuzun derinliklerine inerek, ba\u011flam kavram\u0131n\u0131n inceliklerini ad\u0131m ad\u0131m ke\u015ffedecek ve b\u00f6ylece closure&#039;lara sa\u011flam bir zemin haz\u0131rlayaca\u011f\u0131z.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-28T22:01:26+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Closure \u00d6ncesi Ba\u011flam: JavaScript&#8217;in Kalbine Bir Yolculuk\",\"datePublished\":\"2025-10-28T22:01:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/\"},\"wordCount\":3940,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/\",\"name\":\"Closure \u00d6ncesi Ba\u011flam: JavaScript'in Kalbine Bir Yolculuk\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-28T22:01:26+00:00\",\"description\":\"JavaScript d\u00fcnyas\u0131na yeni ad\u0131m atanlar veya tecr\u00fcbeli geli\u015ftiriciler i\u00e7in closure'lar, ba\u015flang\u0131\u00e7ta gizemli ve karma\u015f\u0131k g\u00f6r\u00fcnebilir. Ancak endi\u015felenmeyin, bu \u201csihirli\u201d yap\u0131lar asl\u0131nda JavaScript'in temel mekanizmalar\u0131n\u0131n do\u011fal bir sonucudur. Closure'lar\u0131 tam anlam\u0131yla kavrayabilmek i\u00e7in, \u00f6ncelikle JavaScript'in y\u00fcr\u00fctme ba\u011flam\u0131, kapsam (scope) ve 'this' anahtar kelimesinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine anlamak kritik \u00f6nem ta\u015f\u0131r. Bu kapsaml\u0131 rehberde, kodunuzun derinliklerine inerek, ba\u011flam kavram\u0131n\u0131n inceliklerini ad\u0131m ad\u0131m ke\u015ffedecek ve b\u00f6ylece closure'lara sa\u011flam bir zemin haz\u0131rlayaca\u011f\u0131z.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Closure \u00d6ncesi Ba\u011flam: JavaScript&#8217;in Kalbine Bir Yolculuk\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Closure \u00d6ncesi Ba\u011flam: JavaScript'in Kalbine Bir Yolculuk","description":"JavaScript d\u00fcnyas\u0131na yeni ad\u0131m atanlar veya tecr\u00fcbeli geli\u015ftiriciler i\u00e7in closure'lar, ba\u015flang\u0131\u00e7ta gizemli ve karma\u015f\u0131k g\u00f6r\u00fcnebilir. Ancak endi\u015felenmeyin, bu \u201csihirli\u201d yap\u0131lar asl\u0131nda JavaScript'in temel mekanizmalar\u0131n\u0131n do\u011fal bir sonucudur. Closure'lar\u0131 tam anlam\u0131yla kavrayabilmek i\u00e7in, \u00f6ncelikle JavaScript'in y\u00fcr\u00fctme ba\u011flam\u0131, kapsam (scope) ve 'this' anahtar kelimesinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine anlamak kritik \u00f6nem ta\u015f\u0131r. Bu kapsaml\u0131 rehberde, kodunuzun derinliklerine inerek, ba\u011flam kavram\u0131n\u0131n inceliklerini ad\u0131m ad\u0131m ke\u015ffedecek ve b\u00f6ylece closure'lara sa\u011flam bir zemin haz\u0131rlayaca\u011f\u0131z.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/","og_locale":"tr_TR","og_type":"article","og_title":"Closure \u00d6ncesi Ba\u011flam: JavaScript'in Kalbine Bir Yolculuk","og_description":"JavaScript d\u00fcnyas\u0131na yeni ad\u0131m atanlar veya tecr\u00fcbeli geli\u015ftiriciler i\u00e7in closure'lar, ba\u015flang\u0131\u00e7ta gizemli ve karma\u015f\u0131k g\u00f6r\u00fcnebilir. Ancak endi\u015felenmeyin, bu \u201csihirli\u201d yap\u0131lar asl\u0131nda JavaScript'in temel mekanizmalar\u0131n\u0131n do\u011fal bir sonucudur. Closure'lar\u0131 tam anlam\u0131yla kavrayabilmek i\u00e7in, \u00f6ncelikle JavaScript'in y\u00fcr\u00fctme ba\u011flam\u0131, kapsam (scope) ve 'this' anahtar kelimesinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine anlamak kritik \u00f6nem ta\u015f\u0131r. Bu kapsaml\u0131 rehberde, kodunuzun derinliklerine inerek, ba\u011flam kavram\u0131n\u0131n inceliklerini ad\u0131m ad\u0131m ke\u015ffedecek ve b\u00f6ylece closure'lara sa\u011flam bir zemin haz\u0131rlayaca\u011f\u0131z.","og_url":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-28T22:01:26+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Closure \u00d6ncesi Ba\u011flam: JavaScript&#8217;in Kalbine Bir Yolculuk","datePublished":"2025-10-28T22:01:26+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/"},"wordCount":3940,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/","url":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/","name":"Closure \u00d6ncesi Ba\u011flam: JavaScript'in Kalbine Bir Yolculuk","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-28T22:01:26+00:00","description":"JavaScript d\u00fcnyas\u0131na yeni ad\u0131m atanlar veya tecr\u00fcbeli geli\u015ftiriciler i\u00e7in closure'lar, ba\u015flang\u0131\u00e7ta gizemli ve karma\u015f\u0131k g\u00f6r\u00fcnebilir. Ancak endi\u015felenmeyin, bu \u201csihirli\u201d yap\u0131lar asl\u0131nda JavaScript'in temel mekanizmalar\u0131n\u0131n do\u011fal bir sonucudur. Closure'lar\u0131 tam anlam\u0131yla kavrayabilmek i\u00e7in, \u00f6ncelikle JavaScript'in y\u00fcr\u00fctme ba\u011flam\u0131, kapsam (scope) ve 'this' anahtar kelimesinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine anlamak kritik \u00f6nem ta\u015f\u0131r. Bu kapsaml\u0131 rehberde, kodunuzun derinliklerine inerek, ba\u011flam kavram\u0131n\u0131n inceliklerini ad\u0131m ad\u0131m ke\u015ffedecek ve b\u00f6ylece closure'lara sa\u011flam bir zemin haz\u0131rlayaca\u011f\u0131z.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/closure-oncesi-baglam-javascriptin-kalbine-bir-yolculuk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Closure \u00d6ncesi Ba\u011flam: JavaScript&#8217;in Kalbine Bir Yolculuk"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33050","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33050"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33050\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}