0

変数を一度計算してから、グローバル変数に依存せずに、関数のすべての実行のスコープ内でそれにアクセスする標準的な方法を探しています。

これは、プロトタイプのプロパティ(変数)の標準的な使用法のようですが、JSプロトタイプで見つけることができるすべての例は、プロトタイプのメソッド(関数)に基づいています。プロトタイプでプロパティ/変数を設定することについて私が見つけることができる唯一のことは、これらについての情報を見つけることができなかった誰かからの質問であり、それが良いか悪いかを尋ねます(tldr:それは問題ありませんが、読みやすさを犠牲にする価値はめったにないことを覚えておいてくださいわずかなパフォーマンスの向上のために)。

動作するプロトタイププロパティを設定して取得する方法がありますが、関数への参照に依存するため(基本的にvar prop = thisfunctionname.prototype.someprop)不格好に感じます。試行錯誤で見つけたので、関数のスコープに戻ってそこから関数を取得することなく、関数内からこれらのプロトタイププロパティを取得するためのよりクリーンで標準的な方法があるかどうかを尋ねたいと思います。


簡単な例を次に示します。別の数値に数値を追加し、それをユーザーの名前の文で返す架空のjQueryプラグインです。ユーザーに名前を1回だけ尋ねてから、その名前をスコープ内で再利用できるように保存します。

(function($) {
  var sum = function( num1,num2 ) {
    var result = num1 + num2;

    // This works, but seems clunky since it depends on the variable `sum` 
    // from the scope around this function - is there a better way?
    var name = sum.prototype.name;

    $(this).text( num1+' plus '+num2+' is '+result+', '+name+'.');
    return $(this);
  };

  var name = prompt('Please enter your name','');

  // Is there a better way to set this default variable to be accessible 
  // in all calls to this function?
  sum.prototype.name = name;

  $.fn.basicArithmetic = sum;

})(jQuery); 
// end of plugin. Example usage...

$('<p/>').basicArithmetic(1,5).appendTo('body');
$('<p/>').basicArithmetic(2,2).appendTo('body');
$('<p/>').basicArithmetic(25,30).appendTo('body');
$('<p/>').basicArithmetic(92.3,15.17).appendTo('body');

ライブjsbinの例。より現実的な実際のユースケースは、プロパティの計算がメモリ使用量に費用がかかる場合、または破壊的である場合です(たとえば、計算中にDOMを変更する必要があります)。

4

1 に答える 1

1

本当に2つの異なる答え:

  1. 通常の方法は、スコープ関数内で変数を使用することです (例では既に便利なものがあります)。プロトタイプはまったく含まれていません。

    (function($) {
      var name;
    
      name = prompt('Please enter your name','');
    
      function sum( num1,num2 ) {
        var result = num1 + num2;
    
        $(this).text( num1+' plus '+num2+' is '+result+', '+name+'.');
        return $(this);
      }
    
      $.fn.basicArithmetic = sum;
    
    })(jQuery); 
    

    更新された JSBin の例| ソース

    (補足:匿名関数式も名前付き関数宣言に変更しましたが、この場合は問題ありません。)

  2. jQuery プラグインでの通常の方法は、プラグインが適用される要素にデータを格納することです。これは、データがプラグインに対してグローバルである必要がある、あなたが示した例では機能しませんが、通常 (必ずしも通常とは限りません) プラグインは、通常は格納するインスタンス固有の情報のみを保持します。要素 (おそらくdata関数経由)。

于 2013-03-05T12:29:36.483 に答える