鉴于以下示例,为什么outerScopeVar在所有情况下都未定义?
var outerScopeVar;
var img = document.createElement('img');
img.onload = function() {
outerScopeVar = this.width;
};
img.src = 'lolcat.png';
alert(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)
var outerScopeVar;
setTimeout(function() {
outerScopeVar = 'Hello Asynchronous World!';
}, 0);
alert(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)
// Example using some jQuery
var outerScopeVar;
$.post('loldog', function(response) {
outerScopeVar = response;
});
alert(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)
// Node.js example
var outerScopeVar;
fs.readFile('./catdog.html', function(err, data) {
outerScopeVar = data;
});
console.log(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)
// with promises
var outerScopeVar;
myPromise.then(function (response) {
outerScopeVar = response;
});
console.log(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)
// geolocation API
var outerScopeVar; …Run Code Online (Sandbox Code Playgroud) 这段代码:
foo = [{id: 1},{id: 2},{id: 3},{id: 4}, {id: 5}, ];
console.log('foo1', foo, foo.length);
foo.splice(2, 1);
console.log('foo2', foo, foo.length);
Run Code Online (Sandbox Code Playgroud)
在Chrome中生成以下输出:
foo1
[Object, Object, Object, Object, Object] 5
0: Object
1: Object
2: Object
3: Object
length: 4
__proto__: Array[0]
5 (index):23
foo2
[Object, Object, Object, Object] 4
0: Object
1: Object
2: Object
3: Object
length: 4
__proto__: Array[0]
Run Code Online (Sandbox Code Playgroud)
小提琴:http://jsfiddle.net/2kpnV/
这是为什么?
我目前正在阅读Trevor Burnham的Async Javascript.到目前为止,这是一本很棒的书.
他谈到这个片段和console.log在Safari和Chrome控制台中是"异步"的.不幸的是我不能复制这个.这是代码:
var obj = {};
console.log(obj);
obj.foo = 'bar';
// my outcome: Object{}; 'bar';
// The book outcome: {foo:bar};
Run Code Online (Sandbox Code Playgroud)
如果这是异步,我会预期结果将成为书籍的结果.console.log()被放入事件队列中,直到执行完所有代码,然后运行它并具有bar属性.
虽然它正在同步运行但它似乎出现了.
我运行此代码错了吗?console.log实际上是异步吗?
我理解这段代码.我们制作A的副本并将其称为C.当A被更改时,C保持不变
var A = 1;
var C = A;
console.log(C); // 1
A++;
console.log(C); // 1
Run Code Online (Sandbox Code Playgroud)
但是当A是阵列时,我们会有不同的情况.C不仅会改变,而且会在我们触及A之前发生变化
var A = [2, 1];
var C = A;
console.log(C); // [1, 2]
A.sort();
console.log(C); // [1, 2]
Run Code Online (Sandbox Code Playgroud)
有人可以解释第二个例子中发生的事情吗?
当我这样做:
var testArray = ["a","b","c"];
console.log(testArray);
console.log("size:" + testArray.length);
Run Code Online (Sandbox Code Playgroud)
我把它印在我的控制台上:
["a", "b", "c"]
size:3
Run Code Online (Sandbox Code Playgroud)
这很好.但是现在我开始拼接这个:
var testArray = ["a","b","c"];
console.log(testArray);
console.log("size:" + testArray.length);
testArray = testArray.splice(0,1);
Run Code Online (Sandbox Code Playgroud)
这恰好在我的控制台中显示:
["b", "c", undefined × 1]
size:3
Run Code Online (Sandbox Code Playgroud)
所以第一个问题是,为什么即使拼接在打印之后它也会弄乱我的阵列打印?大小显示正确,但"a"消失了,我最后得到一个未定义的.
所以我想要做的是删除数组中的第一项.基本上是一个转变.所以我这样做:
var testArray = ["a","b","c"];
console.log(testArray);
console.log("size:" + testArray.length);
testArray = testArray.splice(0,1);
console.log(testArray);
console.log("size:" + testArray.length);
Run Code Online (Sandbox Code Playgroud)
这就是输出的内容:
["b", "c", undefined × 1]
size:3
["a"]
size:1
Run Code Online (Sandbox Code Playgroud)
不仅大小减少了2,它还删除了除"a"之外的所有内容.到底是怎么回事?
考虑这个javascript:
var foo = {bar : 1111};
console.log(foo);
console.log(foo.bar);
foo.bar = 2222;
console.log(foo);
console.log(foo.bar);
Run Code Online (Sandbox Code Playgroud)
在Firefox的firebug中,这显示了我的预期:
Object { bar=1111}
1111
Object { bar=2222}
2222
Run Code Online (Sandbox Code Playgroud)
但是,在Safari和Chrome的控制台中,它显示:
Object { bar=2222}
1111
Object { bar=2222}
2222
Run Code Online (Sandbox Code Playgroud)
换句话说,对象在打印转储时在控制台中显示错误的属性,但是如果打印特定属性则显示正确的值.
这是浏览器的怪癖吗?或者我缺少面向对象的javascript的一个基本方面?
我在javascript中有以下片段,其输出让我觉得出错了.
1.
a=2;
console.log(a);
a+=2;
console.log(a);
Run Code Online (Sandbox Code Playgroud)
输出:2 4 ; 正如所料
2.
t=[0,2];
console.log(t);
t[0]+=2;
console.log(t);
Run Code Online (Sandbox Code Playgroud)
产出:[2,2] [2,2]
输出不应该是 ?并且上述两种情况之间的区别是什么导致两种情况都有不同的答案?[0,2] [2,2]
repl.it:https://repl.it/BuXR/3
var str = "abc";
var str2 = str.split(" ").join("").split("");
var tmp = str2;
console.log(str2);
// => ['a','b','c']
console.log(tmp.reverse());
// => ['c','b','a']
console.log(str2);
// => ['c','b','a']
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么str2正在改变,即使它没有被逆转?
这对我来说非常令人沮丧,但我猜到为什么会发生这种情况.tmp只是指向原始str2的指针,当我在tmp上调用reverse()时,它实际上反转了str2.
即使这确实是正在发生的事情,我仍然觉得这是一种非常违反直觉的语言工作方式.
打开Chrome开发者工具并输入:
var a = [];console.log(a);a.push(1);console.log(a);
你会期望这会输出类似的东西
[]
[1]
Run Code Online (Sandbox Code Playgroud)
但相反,它输出
[1]
[1]
Run Code Online (Sandbox Code Playgroud)
行为是相同的
var a = [];console.log(a);a[0] = 1;console.log(a);
谁能解释这种行为?
在OS X上运行Chrome.在32位Windows 7上运行相同的行为.
编辑:无论语句是否在同一行,行为都是相同的.我只是将它们放在一行上,以便于测试.
把
var a = [];
console.log(a);
a.push(1);
console.log(a);
Run Code Online (Sandbox Code Playgroud)
在一个文件然后运行它会产生相同的行为.
编辑x 2如果您不想制作要测试的文件, 请参阅:http://jsfiddle.net/9N4A6/.
我对JavaScript或Chrome控制台的行为感到非常困惑.有人可以帮我理解吗?
基本上我有以下JavaScript代码,而不是嵌套在任何函数或其他范围内:
var initial_array = [];
function initialiseArray() {
initial_array = [2, 9, 8, 6, 0, 2, 1];
}
function copyToNewArray() {
var copied_array = [];
console.log("COPIED 1", copied_array);
for (var i = 0; i < initial_array.length; i++) {
var copy = initial_array[i];
copied_array.push(copy);
}
console.log("COPIED 2", copied_array);
}
initialiseArray();
copyToNewArray();
Run Code Online (Sandbox Code Playgroud)
我希望COPIED 1打印[]- 因为变量尚未分配 - 而是打印[2, 9, 8, 6, 0, 2, 1]- 即分配后的值.
为什么?
顺便说一句,如果用8-11替换第8行initial_array = copied_array,那么RESULTS 1确实打印为[].这与使用有关 …