Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:如何确保;这";在一个对象中总是相同的吗?_Javascript_This - Fatal编程技术网

Javascript:如何确保;这";在一个对象中总是相同的吗?

Javascript:如何确保;这";在一个对象中总是相同的吗?,javascript,this,Javascript,This,有没有办法确保在对象中访问时,此始终是相同的东西 我有以下代码: var堆栈=[]; var callStack=函数() { for(堆栈中的变量i){ //不起作用 堆栈[i][0]。应用(null,堆栈[i][1]); //也不行 堆栈[i][0]。应用(堆栈[i][0],堆栈[i][1]); } }; var testThis={ 酒吧:“某物”, show:function() { log(this.bar,参数); } } testThis.show('standardCall')

有没有办法确保在对象中访问时,
始终是相同的东西

我有以下代码:

var堆栈=[];
var callStack=函数()
{
for(堆栈中的变量i){
//不起作用
堆栈[i][0]。应用(null,堆栈[i][1]);
//也不行
堆栈[i][0]。应用(堆栈[i][0],堆栈[i][1]);
}
};
var testThis={
酒吧:“某物”,
show:function()
{
log(this.bar,参数);
}
}
testThis.show('standardCall');
push([testThis.show,['someVar']]);
push([testThis.show,['otherVar','yetAnotherVar']]);

调用堆栈()
由函数的调用方式决定。因此,在存储函数时,还必须指定用作此
的内容,以便将其作为第一个参数传递给

var堆栈=[];
var callStack=函数(){
对于(var i=0;i调用堆栈()
由函数的调用方式决定。因此,在存储函数时,还必须指定用作此
的内容,以便将其作为第一个参数传递给

var堆栈=[];
var callStack=函数(){
对于(var i=0;i您只需查看您的范围-以下是几种方法:

stack.push([testThis.show.bind(testThis), ['someVar']]);
stack.push([testThis.show.bind(testThis), ['otherVar', 'yetAnotherVar']]);
或者,如果您始终希望保证此函数在
testThis
的上下文中执行,则可以执行以下操作:

testThis.show = testThis.show.bind(testThis);
然后,您可以继续正常操作:

stack.push([testThis.show, ['someVar']]);
stack.push([testThis.show, ['otherVar', 'yetAnotherVar']]);
无论何时调用函数,即使以后使用
.bind(…另一个对象…
-
调用函数,此
将是
测试此
对象。

您只需要定义范围-以下是几种方法:

stack.push([testThis.show.bind(testThis), ['someVar']]);
stack.push([testThis.show.bind(testThis), ['otherVar', 'yetAnotherVar']]);
或者,如果您始终希望保证此函数在
testThis
的上下文中执行,则可以执行以下操作:

testThis.show = testThis.show.bind(testThis);
然后,您可以继续正常操作:

stack.push([testThis.show, ['someVar']]);
stack.push([testThis.show, ['otherVar', 'yetAnotherVar']]);

无论何时调用函数,即使稍后使用
.bind(…另一个对象…
-
调用函数,此
将是
测试此
对象。

可能重复@hege_hegedus这个问题是误导性的,它是否在对象文本中并不重要。请参阅@hege_hegedus的可能副本。这个问题具有误导性,它是否在对象文本中并不重要。谢谢,这就是我现在的处理方式。但由于调用可能更复杂(testThis.go.very.deep.myMethod…),我担心这很容易为输入错误创造空间。我想也许有一种方法可以强迫它自动地以这种方式工作。换句话说,要确保通过调用堆栈调用的任何内容都会像直接调用一样自动使用“this”。除非您使用,否则始终是调用方确定this
是什么,这是无法避免的。即使使用胖箭头函数,
仍将取决于容器函数的调用方式。有三种处理方法:绑定函数,在外部函数中附加
var self=this
,并使用
self
而不是
this
。为了便于使用,一些回调机制允许您为回调指定
this
。有点奇怪的是,一个方法不能保证访问它自己的对象,但我认为这不是一个哲学辩论的地方,一些编程语言的逻辑有时是没有意义的,所以我要接受诅咒并接受你的答案:)@Malis问题是JavaScript中的对象不是“自己的”任何东西——它们都有属性,这些属性都有值。函数与任何特定的对象都没有特殊的关系,除非它们显式地做(例如,它们进行显式引用或使用
.bind()
)创建,或者除非它们是胖箭头函数。@Malis,在
var a={b:{c:{d:function(){console.log(this)}}}的情况下,
这个
指向什么?如果调用
a.b.c.d()
,它将是
a.b.c
对象,但有些人可能希望它是
a
。正如Pointy所指出的,函数不属于对象。您可以从许多不同的对象引用相同的函数。谢谢,这就是我现在处理它的方式。但由于调用可能更复杂(testThis.go.very.deep.myMethod…),我担心这很容易为输入错误创造空间。我想也许有一种方法可以强迫它自动地以这种方式工作。换句话说,确保