JavaScript变量未定义,即使在分配对象属性方法之后也是如此

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(

在下面的代码中,当我执行跟踪函数时,变量“original”被分配给o[m],它最初是未定义的,但一旦我将o[m]定义为跟踪内的嵌套函数,跟踪函数返回,我希望“original”变量的值应该是新定义的嵌套函数,但出乎意料的是,它仍然未定义。我不明白为什么

   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
的部分中抛出错误。