我试图用选项3和4改变myprop的值,但没有成功。为什么呢?
object1 = {myprop:"value1", ....};
button1.addEventListener('click', function(e){
object1.myMethod("value2"); // 1) working. myMethod is a method that sets myprop's value
object1.myprop="value2"; // 2) working
myFunction1(object1.myMethod); // 3) not working
myFunction2(object1.myprop); // 4) not working
});
function myFunction1(src) {
src("value2");
}
function myFunction2(src) {
src="value2";
}
答案 0 :(得分:2)
您正在传递object1.myMethod
/ object.myprop
的值,已复制到src
变量。
然后,您可以调用该函数(但在不同的上下文中,因此其中this
的值不同)或覆盖src
的值,同时保留原始属性。
如果您希望在正确的上下文中调用该函数,则需要使用call()
或apply()
传递该上下文。
如果要覆盖myprop
中存储的对象的object1
属性,则必须引用object1
的值并在其上设置属性。
答案 1 :(得分:0)
当您定义匿名函数来处理click
事件(button1.addEventListener('click', function(e) {...}
)时,会在闭包中捕获object1.myMethod
和object1.myprop
的值。
它的意思是:你正在定义一个函数,这个函数在执行时需要一些在定义时在范围内的值,而不是它何时执行(object1.myMethod
和{ {1}})。函数正在代码中定义,但是作为参数传递,只要按钮上发生object1.myprop
事件,就会远离那里调用。
会发生click
和object1.myMethod
被评估为其值并在函数关闭时捕获的内容,以便稍后在执行该函数时可用(您不需要&#39 ;看到任何这种情况发生,只是发生了。)
所以,你的方法在这里不起作用。我看到了一个用于设置属性的替代方法,即传递要更改值的对象,并传递要更改的属性的名称。
object1.myprop
对于方法部分,我可以看到3种方法使其工作(实际上是4,如果我使用// 1 way to make the property call work
object1 = {myProp:"value1"};
button1.addEventListener('click', function(e){
myFunction2(object1, 'myProp');
});
function myFunction2(src, prop) {
src[prop]="value3";
};
而不是apply
)。
首先与属性的情况相同:您传递call
以及插槽的名称,即函数。
其次,您可以在object1
的上下文中传递object1
和函数以及稍后的call
函数。
第三,您可以从object1
创建一个绑定到object1.myMethod
的新功能(即object1
将是其上下文),无论如何你稍后会在哪里打电话。这是通过object1
完成的。
示例:
bind