我想拥有我的蛋糕并且也吃它:我希望有一个方法,当它绑定到一个对象时返回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`
答案 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。