簡體   English   中英

了解JavaScript閉包功能

[英]Understanding JavaScript closure functions

我是Javascript的新手,對閉包函數有疑問。

在下面的代碼中,我正在創建一個閉包函數,並為同一函數設置新的屬性名。 我想確定所創建函數的屬性-名字-並使用代碼console.log(obj1.firstname); 顯示它。

但是由於某種原因,它顯示為未定義。 請讓我知道是什么問題。

<html>
  <head>
    <script>
      outerfunction = function(firstname,lastname) {
        var innerfunction = function (sex) {
        console.log(firstname);
        console.log(lastname);
        console.log(sex)
        }

        console.log('Initialize');
        innerfunction.prototype.firstname = firstname;
        return innerfunction;
      }

      obj1 = outerfunction('Bob','Mcdonald');
      console.log(obj1.firstname);
      obj2 = obj1('Male');

      obj1 = outerfunction('Lucy','Mary');
      obj1('Female');

    </script>

  </head>
  <body>
    This is the body
  </body>
</html>

問題在於您使用原型。 如果您執行innerfunction.firstname = firstname; 應該可以解決未定義的問題。

outerfunction = function(firstname,lastname) {
  var innerfunction = function (sex) {
    console.log(firstname);
    console.log(lastname);
    console.log(sex)
  }

  console.log('Initialize');
  innerfunction.firstname = firstname;
  return innerfunction;
}

obj1 = outerfunction('Bob','Mcdonald');
console.log(obj1.firstname);
obj2 = obj1('Male');

obj1 = outerfunction('Lucy','Mary');
obj1('Female');

只是評論:

>  outerfunction = function

應始終聲明變量,尤其是全局變量,以免它們與具有相同名稱或ID的DOM元素沖突(變量將優先)。 聲明變量后,便沒有必要在函數表達式中進行聲明了(如果沒有其他事情,那就不用多說了,但可以在執行任何代碼之前使函數可用,而不是在進行賦值時) )。 所以:

function outerfunction(firstname,lastname) { 

形式參數列表中的項目( firstnamelastname )有效地聲明為局部變量。 因此對於內部功能

  function innerfunction(sex) {
    console.log(firstname);
    console.log(lastname);
    console.log(sex)

該函數對externalfunction的 名字姓氏有一個關閉。

>         innerfunction.prototype.firstname = firstname;

僅當innerfunction是構造函數時才有用,並且僅當您希望實例繼承firstname屬性時才有用。 函數不是從其公共原型繼承而來,而是從其私有[[Prototype]]繼承,后者是其構造函數在構造時的公共原型。

> obj1 = outerfunction('Bob','Mcdonald');

這將返回一個內部函數的“實例”,該實例具有對firstnamelastname的閉包。

> console.log(obj1.firstname);

但是firstname 屬性位於obj1.prototype上 (因為這是分配給它的位置),因此找不到(檢查obj1.prototype.firstname )。

造成混淆的部分原因可能是作用域鏈上的標識符解析(即變量firstnamelastname )與對象及其[[Prototype]]鏈上的對象屬性解析(即繼承和innerfunction.protoype.firstname )之間的區別

暫無
暫無

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

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