首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从其内部引用javascript函数

从其内部引用javascript函数
EN

Stack Overflow用户
提问于 2011-05-22 12:20:31
回答 11查看 48.5K关注 0票数 52

考虑下面这段代码

代码语言:javascript
复制
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

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-05-22 12:40:47

我认为您要求的是arguments.callee,但它现在是不推荐使用的

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/callee

代码语言:javascript
复制
var crazy = function() {
    console.log(this);
    console.log(arguments.callee.isCrazy); // right.
}
crazy.isCrazy = 'totally';
crazy();
// ouput =>
// DOMWindow
// totally
票数 30
EN

Stack Overflow用户

发布于 2012-07-11 02:30:29

正如rfw所说,如果函数只有一个名称,这是最直接的方法:

代码语言:javascript
复制
var crazy = function() {
    console.log(crazy);
    console.log(crazy.isCrazy);
};

crazy.isCrazy = 'totally';
crazy();

以防它可能有不同的名称,或者您想要传递它,它必须包装在一个闭包中:

代码语言:javascript
复制
var crazy = (function(){
    var that = function() {
        console.log(that);
        console.log(that.isCrazy);
    };
    return that;
})();

crazy.isCrazy = 'totally';
crazy();
票数 16
EN

Stack Overflow用户

发布于 2014-10-16 21:16:24

将函数绑定到自身(从@ArunPJohny和@BudgieInWA的回答中获得提示):

代码语言:javascript
复制
crazy = crazy.bind(crazy);

这将使您能够通过this从函数访问其属性。

代码语言:javascript
复制
> crazy()
function () {
    console.log(this);
    console.log(this.isCrazy); // works now
}

与公认的答案相比,这似乎是一个更好的解决方案,后者使用callee功能,该功能已被弃用,并且不能在严格模式下工作。

如果您愿意,现在还可以使用this()递归地调用函数本身。

我们将其命名为self-thisifying.写一小段实用函数:

代码语言:javascript
复制
function selfthisify(fn) { return fn.bind(fn); }
crazy = selfthisify(crazy);
crazy();

或者,如果您喜欢更“语义”的名称,可以将其称为accessOwnProps

如果你是一个语法糖类型的人,你可以在函数原型中添加一个selfthisify属性:

代码语言:javascript
复制
Object.defineProperty(Function.prototype, 'selfthisify', {
    get: function() { return this.bind(this); }
});

现在你可以说

代码语言:javascript
复制
crazy.selfthisify();
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6086008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档