即使在分配对象属性方法后,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 = fizzo现在指向一个不同的东西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 
+0

得知您先生,我会记住它作为一个经验法则,在JS标识符不更新。 – user2913184

+0

你能否详细说明一下o = fizz多一些代码?谢谢所有的帮助 – user2913184

+0

@ user2913184如果你在'o = fizz' **之后做了'e = o' **或**'e =发出嘶嘶声,你会有三个指向同一个东西。这只是你必须手动更新每个标识符。另外,'e.prop()'不应该在我写的代码中抛出错误。 **'o.prop()'**在关于'fizz'的节中抛出一个错误。 –