JavaScript [求助] JavaScript 的执行顺序问题

blacktulip · 2013年07月10日 · 最后由 blacktulip 回复于 2013年07月10日 · 2915 次阅读

正在缓慢地看书... 书上有这么个例子:

首先我是在网页中用 <script> 加载的,像这样:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<script src="learn.js"></script>
</body>
</html>

然后是 learn.js 的内容

function getQueryStringArgs() {
    var qs    = (location.search.length > 0 ? location.search.substring(1) : "");
    var args  = {};
    var items = qs.length ? qs.split("&") : [];
    var item  = null;
    var name  = null;
    var value = null;

    var i = 0;
    var len = items.length;

    for (i = 0; i < len; i++) {
        item  = items[i].split("=");
        name  = decodeURIComponent(item[0]);
        value = decodeURIComponent(item[1]);
        if (name.length) {
            args[name] = value;
        }
    }
    return args;

}

// 以上是书上的例子
// 以下是我自己加的运行语句

location.assign("http://www.google.com/?q=javascript&num=10");
var args = getQueryStringArgs();
alert(args["num"]);

那个 function 是把 url 里面的 query 拆成 object 这个很容易看懂啦。 问题是这样运行是不对的,每次都先给我跳出 alert,每次都是 undefined ,然后才跳到 http://www.google.com/?q=javascript&num=10 这个页面。

JS 运行不是应该自上而下么?不是应该先把 location 设好了再运行下面的语句么?为什么实际运行不是这样的呢?

var items = qs.length ? qu.split("&") : [];

错别字 qu 应该是 qs

#1 楼 @loveky oh, 谢谢,不过运行起来还是一样....

#2 楼 @blacktulip 你确定?我改完以后就正常了啊,

#3 楼 @loveky 咦?为什么会这样呢?请问你是怎么运行的?我是放在一个网页里面用 <script> 加载的,类似这样

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<script src="learn.js"></script>
</body>
</html>

@blacktulip 你在看哪本书?javascript 我的状态一直是要用的时候 google 一下,it works 就满意了,从来没有系统学过。

#4 楼 @blacktulip oh, my bad... 我是在 console 里直接 run 的,我放到文件试试

对 location 赋值会导致跳转的呀 alert 是阻塞的 调试用 console.log 把location.assign("http://www.google.com/?q=javascript&num=10"); 改成history.pushState(null, "", "?q=javascript&num=10");也能看出来

#8 楼 @krazy 噢,用 history.pushState 就正常了。非常感谢。我还是不理解为什么我那几行代码执行起来是先 alert 后跳转...

#8 楼 @krazy

我改成

console.log(location.href)
location.assign("http://www.google.com/?q=javascript&num=10");
console.log(location.href)

然后去掉 alert 语句,两次 console 中输出的都是 file:///Users/gewang/Desktop/test.html 这是为啥呢,assign 不会更新 location 的值,而是推迟到页面加载完成才更新吗?

#10 楼 @loveky
location 赋值后的代码会被浏览器试着执行,但是一旦跳转的话就执行不了了,要执行肯定也是在页面跳转前执行的 不同的浏览器还可能有不同的行为..

#11 楼 @krazy 所以说为了把语句都执行完,浏览器就自作主张把 location.assign 放到最后去执行了么...

#12 楼 @blacktulip 我觉得不是 只能说location.assign不是阻塞的 在浏览器真正执行跳转前就执行到 alert 了 然后 alert 又是阻塞的

#13 楼 @krazy 噢,你的意思是 location.assign 执行起来太慢,还没 url 换过来浏览器就已经往下执行到 alert 了,于是就堵在那里了是吧?应该是这么回事,谢谢了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号