为什么' this '在作为字符串或引用传递函数参数时发生变化

Why does `this` change when passing the function argument as string or reference?

本文关键字:参数 传递函数 变化 引用 字符串 this 为什么      更新时间:2023-09-26

看看这个:

var a = {
    b: function() {
      console.log(this); 
    }  
}
// Example 1
a.b(); // a
// Example 2    
eval('a.b()'); // a
    
// Example 3
setTimeout('a.b()', 100); // a
// Example 4
setTimeout(a.b, 100); // Window
// Example 5
var c = a.b;
c(); // Window

jsFiddle .

假设期望的结果期望的…

示例1

当调用b()时,Object的属性,this变成属性的Object,这里是父a。它产生预期的结果。

示例2

eval()意味着采用调用它的执行上下文,在本例中是window。它还会产生预期的结果。

示例3

当将字符串传递给setTimeout()时,我想象它会通过与eval()非常相似的东西运行。它也产生了预期的结果。

示例4

this在本例中变为Window。这就是我感兴趣的。

示例5

这里this变成了Window,因为c的父对象是Window

  1. 当只传递一个对函数的引用时(例如a.b),当用()调用时,它的this是否总是Window ?

  2. 保持this作为a的唯一方法是将其作为字符串传递给setTimeout()/setInterval()吗?

当只传递一个函数的引用时(例如a.b),当调用with()时,它的this是否总是Window ?

是的

是唯一的方法来保持这作为一个传递它作为一个字符串setTimeout()/setInterval()?

。而是创建一个新函数。

setTimeout(function() { a.b() }, 100);

开发人员经常对javascript的this关键字感到困惑。最重要的是要记住,它是由调用提供的。

在第四个例子中:

// Example 4
setTimeout(a.b, 100); // Window

第一个参数是对函数的引用,因此调用它时没有任何"父"对象。因为调用没有提供对象,所以这个被设置为window

你对例子5的评论:

这里this变成了Window,因为c的父对象是Window。

并不是真的不正确。因为函数调用没有提供一个对象作为this使用,所以它被设置为window(这是没有提供对象时的默认值)。

是保持其this为a的唯一方法将其作为字符串传递给setTimeout()/setInterval () ?

。除了将其作为对象的属性调用之外,您还可以使用callapply:

var x = a.b;
x.call(a);