严格模式返回此w / o违规

时间:2012-08-29 20:46:00

标签: javascript this ecmascript-5 strict-mode

我想拥有我的蛋糕并且也吃它:我希望有一个方法,当它绑定到一个对象时返回this进行链接,但是当它被调用时返回undefined |未定义的范围。这似乎工作正常,但如果你把它放入JSLint,那么你会收到严重违规错误。我不需要使用严格模式,但似乎这应该是可能的it works(打开控制台)。这样可以和/或你怎么能达到这个效果呢?

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`

2 个答案:

答案 0 :(得分:1)

这几乎可以做你想要的。

dontTouchThis将在支持“use strict”指令的环境中为null,并将在不支持它的那些引用全局对象。

首先,您可以用.call(null)替换(function(){return this})()块;它会有或多或少相同的效果。

其次,不要忘记,当涉及this值时,有4种方式可以调用函数:作为方法,作为独立(无基础)函数,通过调用/应用,以及{ {1}}运算符。这意味着:

  • new将返回new (o.meth)
  • o将返回o.meth.call(o2, ...)
  • o2将返回o.meth.call(null, ...)

最后,如果有人将undefined别名为全局变量,那么在严格模式支持环境meth将返回全局对象,而不是meth(),因为undefined cantTouchThis)将不等于null(将引用全局对象)。

this

答案 1 :(得分:0)

为了保证冗余安全,我最终使用本地功能来“解决”范围解决方案:

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

请参阅用法in the source here