即使在分配对象属性方法后,JavaScript变量仍未定义
问题描述:
在下面的代码中,当我执行跟踪函数并将变量“original”分配给最初未定义的o [m]时,但是一旦将o [m]定义为嵌套函数内部跟踪和跟踪函数返回我期望“原始”变量的值应该是新定义的嵌套函数,但令我惊讶的是它仍然是未定义的。我不明白为什么?即使在分配对象属性方法后,JavaScript变量仍未定义
var o = {};
function trace(o, m) {
var original = o[m];
o[m] = function() {
alert(new Date(), "Exiting:", m);
var result = original.apply(this, arguments);
alert(new Date(), "Exiting:", m);
alert(result);
};
}
trace(o, "m");
o.m("My JavaScript");
答
当您更改用于设置它们的源时,标识符不会更新。
var o = {prop: function() {return 'old ref';}};
var foo = o.prop; // foo() === "old ref"
o.prop = function() {return 'new ref';};
foo(); // "old ref"
但是,它也可能是值得关注的
var e = o; // o as before
o.prop = function() {return 'even newer ref';};
e.prop(); // "even newer ref"
e === o; // true
当标识符引用了对象它引用相同的对象,而不是一个副本,因此它所做的更改影响他们所有。这是因为你所访问的对象与标识符而不是对象的财产,即e === o
如果你要再做o = fizz
,o
现在指向一个不同的东西e
所以e !== o
var fizz = {buzz: "I'm something new!"};
o = fizz;
e.buzz; // undefined, e points at {prop: function() {...}}, not fizz
o.prop(); // TypeError, o points at fizz, not e
o.buzz; // "I'm something new!"
e === o; // false
fizz === o; // true
最后,通过查看你试图这样做,你可能需要考虑什么“是有什么事过吗?”。这就是为什么你的代码当前抛出错误。
function change(obj, prop, echo) {
var prev_method = obj[prop];
obj[prop] = function() {
if (prev_method) // only if we had something before
prev_method.apply(this, arguments); // try to invoke it
console.log(echo);
};
}
var o = {};
change(o, 'spell', 'H');
change(o, 'spell', 'e');
change(o, 'spell', 'l');
change(o, 'spell', 'l');
change(o, 'spell', 'o');
o['spell'](); // returns undefined, logs H, e, l, l, o
得知您先生,我会记住它作为一个经验法则,在JS标识符不更新。 – user2913184
你能否详细说明一下o = fizz多一些代码?谢谢所有的帮助 – user2913184
@ user2913184如果你在'o = fizz' **之后做了'e = o' **或**'e =发出嘶嘶声,你会有三个指向同一个东西。这只是你必须手动更新每个标识符。另外,'e.prop()'不应该在我写的代码中抛出错误。 **'o.prop()'**在关于'fizz'的节中抛出一个错误。 –