考虑一下这段代码
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)
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)
小智 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,一切都会好起来的。
| 归档时间: |
|
| 查看次数: |
41510 次 |
| 最近记录: |