2

私は自分のケーキを持って食べたい:thisオブジェクトにバインドされたときに連鎖のために戻りundefined、null|undefined スコープで呼び出されたときに戻るメソッドが必要です。これはうまくいくように見えますが、 JSLintに入れると Strict Violation エラーが発生します。厳密モードを使用する必要はありませんが、これは可能なはずであり、機能しているようです(コンソールを開きます)。これでよろしいですか、また/または他にどのようにこの効果を達成できますか?

var o = {}; // or some pre-existing module
o.meth = (function (undefined) {

    // contrived example where you'd want to be able to locally 
    // access `meth` even if the outer `o.meth` was overwritten

    'use strict';

    var hash = Object.create(null); // "object" with no properties

    // global ref - or `null` where strict mode works
    var cantTouchThis = (function () {
        return this; 
    }).call(null);

    function meth (k, v) {
        var n;
        if (typeof k == 'object') { // set multi
            for (n in k) {
                meth(n, k[n]);
            }
        } else {
             if (v === undefined) { return hash[k]; } // get
             hash[k] = v; // set
        }
        if (this == cantTouchThis) { return; }
        return this;
    }

    return meth;

}());

そして、コンソールを見ると:

var localM = o.meth; // now scopeless
console.log(  o.meth('key', 'val')  ); // should return `o`
console.log(  localM('key', 'val')  ); // should return `undefined`
4

2 に答える 2

1

これは、ほとんどあなたが望むことをします。

dontTouchThisnull「use strict」ディレクティブをサポートする環境にあり、それをサポートしていない環境ではグローバル オブジェクトを参照します。

まず、その.call(null)チャンクを単に(function(){return this})();に置き換えることができます。多かれ少なかれ同じ効果があります。

第二に、値に関しては、関数を呼び出す方法が 4 つあることを忘れないでくださいthis。メソッドとして、スタンドアロン (ベースレス) 関数として、call/apply を介して、およびnew演算子を使用します。この意味は:

  • new (o.meth)戻りますo
  • o.meth.call(o2, ...)戻りますo2
  • o.meth.call(null, ...)戻りますundefined

最後に、誰かmethがグローバル変数にエイリアスを設定した場合、厳密モードをサポートする環境では、 (being ) が (グローバル オブジェクトを参照する) と等しくないためではなく、meth()グローバル オブジェクトが返されます。undefinedcantTouchThisnullthis

// in global scope

var meth = o.meth;
meth(...); // `this` references global object, will return global object

(function() {

  // in local scope
  var meth = o.meth;

  meth(...); // `this` is `undefined`, will return `undefined`

})();
于 2012-09-01T22:02:40.463 に答える
0

冗長に安全にするために、スコープの解決を「接地」するためにローカル関数を使用することになりました。

var gnd = (function () {
    var globe = this || window;
    return function (o) {
        // for grounding (securing) scope
        return o == null || o === globe ? 0 : o;
    };
}());

ソースの使用法については、こちらを参照してください。

于 2012-09-14T01:48:28.293 に答える