考虑下面这段代码
var crazy = function() {
console.log(this);
console.log(this.isCrazy); // wrong.
}
crazy.isCrazy = 'totally';
crazy();
// ouput =>
// DOMWindow
// undefined
从内部疯狂() ' this‘引用窗口,我猜这是有意义的,因为通常你会希望它引用函数附加到的对象,但我如何才能让函数引用它自己,并访问它自己的属性集?
答案:
不要使用arguments.callee,只需使用命名函数即可。
“注意:您应该避免使用arguments.callee(),只给每个函数(表达式)一个名称。”通过MDN article on arguments.callee
发布于 2011-05-22 12:40:47
我认为您要求的是arguments.callee,但它现在是不推荐使用的。
https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/callee
var crazy = function() {
console.log(this);
console.log(arguments.callee.isCrazy); // right.
}
crazy.isCrazy = 'totally';
crazy();
// ouput =>
// DOMWindow
// totally
发布于 2012-07-11 02:30:29
正如rfw所说,如果函数只有一个名称,这是最直接的方法:
var crazy = function() {
console.log(crazy);
console.log(crazy.isCrazy);
};
crazy.isCrazy = 'totally';
crazy();
以防它可能有不同的名称,或者您想要传递它,它必须包装在一个闭包中:
var crazy = (function(){
var that = function() {
console.log(that);
console.log(that.isCrazy);
};
return that;
})();
crazy.isCrazy = 'totally';
crazy();
发布于 2014-10-16 21:16:24
将函数绑定到自身(从@ArunPJohny和@BudgieInWA的回答中获得提示):
crazy = crazy.bind(crazy);
这将使您能够通过this
从函数访问其属性。
> crazy()
function () {
console.log(this);
console.log(this.isCrazy); // works now
}
与公认的答案相比,这似乎是一个更好的解决方案,后者使用callee
功能,该功能已被弃用,并且不能在严格模式下工作。
如果您愿意,现在还可以使用this()
递归地调用函数本身。
我们将其命名为self-thisifying.写一小段实用函数:
function selfthisify(fn) { return fn.bind(fn); }
crazy = selfthisify(crazy);
crazy();
或者,如果您喜欢更“语义”的名称,可以将其称为accessOwnProps
。
如果你是一个语法糖类型的人,你可以在函数原型中添加一个selfthisify
属性:
Object.defineProperty(Function.prototype, 'selfthisify', {
get: function() { return this.bind(this); }
});
现在你可以说
crazy.selfthisify();
https://stackoverflow.com/questions/6086008
复制相似问题