【发布时间】:2011-10-30 00:13:49
【问题描述】:
第一个例子:
在以下示例中:http://jsfiddle.net/maniator/ScTAW/4/
我有这个js:
var storage = (function () {
var store = [];
return {
"add": function (item) {
store.push(item);
},
"get": function () {
return store;
}
};
}());
storage.add('hi there')
console.log(storage, storage.get(), storage.add('hi there #2'));
这是打印到控制台的内容:
对象 [“你好”,“你好 #2”] 未定义
有人会认为控制台应该只说:
对象 [“你好”] 未定义
因为第二次推送不会在值被记录之后发生,因此不应显示。
第二个例子:
在以下示例中:http://jsfiddle.net/maniator/ScTAW/5/
我使用相同的 storage 变量,但我是这样记录的:
storage.add('hi there')
console.log(storage, storage.get(), (function() {
storage.add('hi there #2');
console.log('TESTING');
})());
打印到控制台的是:
测试
目的 [“你好”,“你好 #2”] 未定义
嗯嗯,现在很奇怪不是吗?可以期待看到:
对象 [“你好”] 未定义
测试
为什么会这样?控制台日志机制的幕后发生了什么?
【问题讨论】:
-
我看到了一篇关于此的有趣博文:felix-kling.de/blog/2011/08/18/…。
-
我认为可以肯定地说 log 方法中的所有参数都必须从右到左进行评估,因为左侧的参数可以包含来自右侧参数的数据。
-
@Jamie,那么您选择了错误的示例,因为在那个示例中(就像您的
console.log("The %s jumped over %d tall buildings", "dog", 5)一样,它们的顺序无关紧要。您似乎认为是因为语义格式取决于参数(或相反?),它们被读取的顺序很重要。但这并不重要,它们都只是 独立的字符串 i> 传递给函数。 -
评估参数顺序的唯一地方是像
i++ + ++i这样的病理情况或OP的例子,你既是reading又是writing 到 内存中的相同位置 在 相同的指令 中。 -
在javascript中,函数的参数从左到右求值,然后传递给函数。如果右侧的参数之一修改了左侧涉及的对象,则该函数将获取处于修改状态的对象,因为它是一个引用。哪个参数“需要”哪个其他参数没有任何区别。
标签: javascript console logging