相关疑难解决方法(0)

为什么我的变量在函数内部修改后没有改变? - 异步代码引用

鉴于以下示例,为什么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)

javascript asynchronous

675
推荐指数
6
解决办法
18万
查看次数

对象和console.log的奇怪行为

这段代码:

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/

这是为什么?

javascript google-chrome object

91
推荐指数
1
解决办法
4万
查看次数

console.log()异步还是同步?

我目前正在阅读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实际上是异步吗?

javascript asynchronous

72
推荐指数
1
解决办法
3万
查看次数

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)

有人可以解释第二个例子中发生的事情吗?

javascript variables google-chrome

43
推荐指数
4
解决办法
3万
查看次数

在将数组拼接分配给自身时,Javascript控制台打印无法正常工作

当我这样做:

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 arrays

19
推荐指数
1
解决办法
3万
查看次数

为什么javascript对象在Chrome,Firefox,Safari的控制台中显示不同的值?

可能重复:
Chrome的JavaScript控制台是否懒于评估数组?

考虑这个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

14
推荐指数
1
解决办法
7762
查看次数

console.log中的值错误

可能重复:
Chrome的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]

javascript google-chrome

13
推荐指数
2
解决办法
3495
查看次数

为什么会这样?(javaScript的反向方法)

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.

即使这确实是正在发生的事情,我仍然觉得这是一种非常违反直觉的语言工作方式.

javascript arrays reverse

13
推荐指数
3
解决办法
895
查看次数

Chrome开发者工具中的奇怪的console.log行为

可能重复:
Chrome的JavaScript控制台是否懒于评估数组?

打开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 google-chrome

12
推荐指数
1
解决办法
2364
查看次数

JavaScript控制台在分配变量之前打印指定的变量值?

我对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确实打印为[].这与使用有关 …

javascript

10
推荐指数
1
解决办法
5428
查看次数