JavaScript变量未定义,即使在分配对象属性方法之后也是如此
在下面的代码中,当我执行跟踪函数时,变量“original”被分配给o[m],它最初是未定义的,但一旦我将o[m]定义为跟踪内的嵌套函数,跟踪函数返回,我希望“original”变量的值应该是新定义的嵌套函数,但出乎意料的是,它仍然未定义。我不明白为什么JavaScript变量未定义,即使在分配对象属性方法之后也是如此,javascript,Javascript,在下面的代码中,当我执行跟踪函数时,变量“original”被分配给o[m],它最初是未定义的,但一旦我将o[m]定义为跟踪内的嵌套函数,跟踪函数返回,我希望“original”变量的值应该是新定义的嵌套函数,但出乎意料的是,它仍然未定义。我不明白为什么 var o = {}; function trace(o, m) { var original = o[m]; o[m] = function () { alert(new Date(
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
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
如果你当时要做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
更改用于设置标识符的源时,标识符不会更新
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
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
如果你当时要做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中的标识符不会更新。你能不能用一些代码来详细解释一下o=fizz?谢谢你的帮助help@user2913184如果您执行了
e=o
(在o=fizz
之后)或e=fizz
操作,则所有3个都指向同一事物。只是您必须手动更新每个标识符。另外,e.prop()
不应该在我编写的代码中抛出错误o.prop()
在关于fizz
的部分中抛出了一个错误。明白了,先生,我会根据经验记住,JS中的标识符不会更新。你能不能用一些代码来详细解释一下o=fizz?谢谢你的帮助help@user2913184如果你做了e=o
(在o=fizz
之后)或者e=fizz
然后你会让所有3个指向同一个东西。只是您必须手动更新每个标识符。另外,e.prop()
不应该在我编写的代码中抛出错误o.prop()
在关于fizz
的部分中抛出错误。