为什么' this '在作为字符串或引用传递函数参数时发生变化
Why does `this` change when passing the function argument as string or reference?
看看这个:
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
。它产生预期的结果。
eval()
意味着采用调用它的执行上下文,在本例中是window
。它还会产生预期的结果。
示例3
当将字符串传递给setTimeout()
时,我想象它会通过与eval()
非常相似的东西运行。它也产生了预期的结果。
示例4
this
在本例中变为Window
。这就是我感兴趣的。
示例5
这里this
变成了Window
,因为c
的父对象是Window
。
当只传递一个对函数的引用时(例如
a.b
),当用()
调用时,它的this
是否总是Window
?保持
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 () ?
。除了将其作为对象的属性调用之外,您还可以使用call
或apply
:
var x = a.b;
x.call(a);
- 函数未将值作为参数传递
- 如何在HTML元素上创建函数,而不是将元素作为参数传递
- 如何传递函数中的参数
- 将参数传递给函数
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 传递带有参数的函数
- javascript,将参数传递给函数内部的闭包中的回调
- 将字符串作为参数传递给函数onclick event jquery
- 将修改后的数组作为参数传递给函数
- 代码气味-将布尔控制参数传递给函数
- 将参数传递给函数,同时保留事件处理程序
- 如何使用按钮将参数传递给函数
- 作为参数传递时如何计算函数
- 将对象作为参数传递时的 Javascript 函数作用域
- 将回调作为参数传递给函数
- 在构造控制器、服务等时作为函数参数传递之前列出的角度 JS 变量
- 作为参数传递的函数的异步执行
- 将请求作为参数传递给函数
- 什么时候需要在javascript中的函数中将对象作为参数传递
- Javascript,对象,用参数传递函数作为参数- angular, jquery概念基本误区