簡體   English   中英

JavaScript關閉與本地

[英]JavaScript Closure vs. Local

我有一個Javascript主文件,由一個立即調用的閉包括(以免污染'全局':

(function () {
"use strict";
   var closureVariable = [];
...
}());

從函數頭中刪除變量時,我做了一個簡單的,有頭骨的編碼錯誤,這樣我的代碼就有了逗號而不是分號:

function fred () {
    var i,

    closureVariable = [1,2,3,4];
    confused();
}
function confused () {
    console.log(closureVariable);     // Prints '[]'
}

當然,'var i'行上缺少的分號就是問題所在。 然而,我認為應該發生的行為是我現在本地定義的變量'closureVariable'應該遮蔽更高級別的范圍定義,並且我的本地定義變量的值應該可用於范圍鏈中較低的函數(也就是說,'confused'功能應該打印出'[1,2,3,4]';

我在這里對Javascript范圍鏈的理解是什么?

var i,

    closureVariable = [1,2,3,4];

fred函數和此范圍中定義的函數中提供了兩個新變量。

這些變量與fred范圍外定義的任何變量完全不同,即使它們碰巧具有相同的名稱。

這里的陰影意味着名為"closureVariable"的變量阻止對外部作用域中具有相同名稱的變量的任何直接訪問。

您期望的是動態范圍 這是一種有效的語言設計選擇,盡管今天被廣泛認為是劣等的。 這不是Javascript的作用。 像許多流行語言一樣,Javascript使用詞法范圍 這意味着confused的范圍不被視為fred的子范圍,因為它的定義不在fred的定義范圍內。 fred call confused的事實沒有效果。

當您通過省略分號重新定義closureVariable時,它僅在fred函數的上下文中重新定義。 混淆函數存在於閉包的上下文中,因此它仍然可以看到原始的closureVariable。 如果你在fred函數中定義了你的混淆函數,它會看到新的closureVariable並打印[1,2,3,4]

(function () {
  "use strict";
  var closureVariable = [];
  function fred () {
   var i,

   closureVariable = [1,2,3,4];

   function confused () {
      console.log(closureVariable);     
   }

   confused();  // print [1,2,3,4]
  }
 })();

或者,如果你想從fred()外面打電話混淆

(function () {
  "use strict";
  var closureVariable = [];
  var confused;

  function fred () {
   var i,

   closureVariable = [1,2,3,4];

   confused = function () {
      console.log(closureVariable);     
   }  
  }

  confused();  // print [1,2,3,4]
 })();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM