jQuery/JavaScript“this”指针混淆

IT技术 javascript jquery this
2021-03-05 22:33:26

bar调用函数时“this”的行为让我感到困惑。请参阅下面的代码。当从单击处理程序调用 bar 而不是 html 元素时,有什么方法可以将“this”安排为一个普通的旧 js 对象实例?

// a class with a method

function foo() {

    this.bar();  // when called here, "this" is the foo instance

    var barf = this.bar;
    barf();   // when called here, "this" is the global object

    // when called from a click, "this" is the html element
    $("#thing").after($("<div>click me</div>").click(barf));
}

foo.prototype.bar = function() {
    alert(this);
}
6个回答

欢迎来到 JavaScript 的世界!:D

您已经进入了 javascript 作用域和闭包的领域。

简短的回答:

this.bar()

foo的范围内执行,(因为这里指的是foo

var barf = this.bar;
barf();

在全局范围内执行。

this.bar 基本上意味着:

this (foo)的作用域下执行this.bar指向的函数当您将 this.bar 复制到 barf 并运行 barf 时。Javascript 理解为,运行 barf 指向的函数,由于没有this,它只是在全局范围内运行。

要纠正此问题,您可以更改

barf();

到这样的事情:

barf.apply(this);

这告诉 Javascript在执行之前this的作用域绑定到 barf。

对于 jquery 事件,您将需要使用匿名函数,或扩展原型中的绑定函数以支持作用域。

欲了解更多信息:

我自己对术语不是 100% 确定,但我认为这个答案(以及与之相关的资源)将“范围”与“执行上下文”混淆了。指向的对象this执行上下文,并且完全独立于作用域(闭包与之相关)。作用域是在函数创建时确定的,并确定函数可以看到哪些变量;每当调用函数时都会确定执行上下文,并确定this引用的内容。在这里到处都用“执行上下文”替换“范围”,只有这样它才会正确 - 我想!
2021-05-03 22:33:26

thisQuirksMode上有一个关于JavaScript 中关键字的很好的解释

获取这本书:JavaScript:好的部分。

另外,尽可能多地阅读 Douglas Crockford http://www.crockford.com/javascript/

您可以Function.apply在函数上使用来设置this应该引用的内容:

$("#thing").after($("<div>click me</div>").click(function() {
    barf.apply(document); // now this refers to the document
});
除了在您的代码中缺少封闭括号这一事实之外 - 函数apply 会立即执行函数barf而不是返回函数指针。
2021-05-18 22:33:26