从内部引用javascript函数

tim*_*ley 51 javascript

考虑一下这段代码

var crazy = function() {
    console.log(this);
    console.log(this.isCrazy); // wrong.
}
crazy.isCrazy = 'totally';
crazy();
// ouput =>
// DOMWindow
// undefined
Run Code Online (Sandbox Code Playgroud)

从内部疯狂()'this'指的是窗口,我想这是有道理的,因为通常你想要这个引用函数所附加的对象,但是我怎样才能让函数引用它自己,并访问一个属性设置自己?

回答:

不要使用arguments.callee,只需使用命名函数.

"注意:你应该避免使用arguments.callee(),只需给每个函数(表达式)一个名字." 通过关于arguments.callee的MDN文章

KZ.*_*KZ. 27

我认为你要求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
Run Code Online (Sandbox Code Playgroud)

  • 危险!不是最好的做法!将在"使用严格"模式下失败.还有其他方法可以解决这个问题. (7认同)
  • @MattJensen 比如? (2认同)

zup*_*upa 14

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

var crazy = function() {
    console.log(crazy);
    console.log(crazy.isCrazy);
};

crazy.isCrazy = 'totally';
crazy();
Run Code Online (Sandbox Code Playgroud)

如果它可能有不同的名称,或者你想传递它,它必须包装在一个闭包中:

var crazy = (function(){
    var that = function() {
        console.log(that);
        console.log(that.isCrazy);
    };
    return that;
})();

crazy.isCrazy = 'totally';
crazy();
Run Code Online (Sandbox Code Playgroud)

  • 关闭的好思路. (2认同)

小智 10

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

crazy = crazy.bind(crazy);
Run Code Online (Sandbox Code Playgroud)

这将使您可以通过this.

> crazy()
function () {
    console.log(this);
    console.log(this.isCrazy); // works now
}
Run Code Online (Sandbox Code Playgroud)

这似乎是比接受的答案更好的解决方案,后者使用callee已弃用且在严格模式下不起作用的功能。

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

我们将称之为self-thisifying。写一个小实用函数:

function selfthisify(fn) { return fn.bind(fn); }
crazy = selfthisify(crazy);
crazy();
Run Code Online (Sandbox Code Playgroud)

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

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

Object.defineProperty(Function.prototype, 'selfthisify', {
    get: function() { return this.bind(this); }
});
Run Code Online (Sandbox Code Playgroud)

现在你可以说

crazy.selfthisify();
Run Code Online (Sandbox Code Playgroud)


小智 5

你必须给它自己的名字,所以:

var crazy = function() {
    console.log(crazy);
    console.log(crazy.isCrazy);
}
crazy.isCrazy = 'totally';
crazy();
Run Code Online (Sandbox Code Playgroud)

该变量this仅适用于对象的范围,例如,如果您使用 调用您的crazy函数版本crazy.call(crazy),它将在函数的上下文中调用该函数crazy,一切都会好起来的。