gpt4 book ai didi

javascript - 用 'this' 定义的函数,但在没有 'this' 的情况下执行

转载 作者:搜寻专家 更新时间:2023-11-01 04:58:01 24 4
gpt4 key购买 nike

我原以为“taco”函数的第二次调用会产生运行时错误,因为我没有使用“this”关键字调用它:

function foo() {
var bar = "baz";

this.taco = function() {
console.log(bar);
};
this.taco();
taco(); // I expected a runtime error here.
}

foo();

然而,事实并非如此。

这是相同代码的 fiddle :http://jsfiddle.net/phillipkregg/gdFxU/226/

JavaScript 是否在此处使用某种类型的隐式上下文管理?

只是好奇,谢谢!

最佳答案

原因是当您调用foo() 时,您是在window 对象的范围内调用它。这意味着在 foo() 内部,this 的值被设置为 window

因此,this.taco() 实际上是 window.taco(),与 taco() 相同。换句话说,taco() 是一个全局函数,因此无论您将其称为 taco() 还是 window.taco() 或者当 thiswindow 时作为 this.taco()

如果你将 taco() 作为一个像这样的新对象,其中 this 被设置为 foo 的一个新实例并且不等于到 window,然后你会得到预期的运行时错误:

function foo() {
var bar = "baz";

this.taco = function() {
console.log(this);
console.log(bar);
};
this.taco();
taco(); // I expected a runtime error here.
}

var x = new foo();

示例:http://jsfiddle.net/jfriend00/3LkxU/


如果您对 this 的值感到困惑,可以使用以下 javascript 规则来确定 this 的值:

  1. 如果您使用 new 调用函数,例如 x = new foo(),则会创建一个新的 foo 实例并且 this 的值设置为 foo() 函数内的那个对象,并且默认情况下从 foo() 返回新实例。

  2. 如果您正常调用任何函数,如 foo(),则 this 的值将设置为全局对象,在浏览器中为 window 或如果处于 javascript 较新的“严格”模式,则 this 将是 undefined。这就是您的原始示例中发生的情况。

  3. 如果您调用带有对象引用的方法,例如 obj.foo(),那么 this 将被设置为 obj对象。

  4. 如果你用.apply().call()进行函数调用,那么你可以具体控制this的值是什么 设置为 .apply().call() 的第一个参数。例如:foo.call(obj) 将调用 foo() 函数并将 this 指针设置为 obj对象。

  5. 如果您不在任何函数调用中(例如在全局范围内),则 this 将是全局对象(浏览器中的 window)或 undefined 在严格模式下。

  6. 与上述所有规则一样,this 由调用者调用您的方式控制,而不是函数/方法的定义方式。

关于javascript - 用 'this' 定义的函数,但在没有 'this' 的情况下执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12042946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com