js 异步中变量的使用问题


 const div =  Div()
        function Div() {
            const url = "http://localhost:3000/"

            function bulid() {
                const res = getData()
                res.done(function(x) {
                    console.log(url);           <---这里是异步调用为什么还能获取到变量url
                    console.log(x)
                }
            }

            function getData() {
                let deferred =  $.Deferred()
                $.ajax({
                    type: "GET",
                    url: url,
                    dataType: "json",
                    success: function (res) {
                        deferred.resolve(res)
                    },
                    error: function (jqXHR) {
                        deferred.reject()
                    }
                });
                return deferred
            }

            return {
                bulid: bulid
            }

        }

        div.bulid()

如上代码,为什么bulid()方法中的done的函数体内,明明都是异步了,为什么还能使用变量url?(url在done中没有声明,也不是传递的参数,它保存在哪)

另外,关于ajax的【回调函数】,这种用法算吗?

                console.log(url);           <---这里是异步调用为什么还能获取到变量url

url变量不是异步返回的结果,他是Div对象的this指向的成员变量,因此是可以跨块调用的,它始终存在于this的内存空间作为成员不会销毁的。因此可以被引用。有帮助请采纳,谢谢支持!

  1. 它只是异步而已,异步不会影响命名空间规则的;
  2. url这个参数存储在栈(stack)当中,
  3. 回调函数也一样;

js首先是单线程的,属于浏览器内核进程的其中一个线程,所以其中所有执行的任务都不会受到进程之间因为内存产生的通讯限制,也就是在同一页面下js理论上是可以调用所有参数的,只是会受到其他规则的影响,例如命名空间的规则。

再说下异步,刚讲了js是单线程,js是无法同时处理1个以上的任务的,这部分说起来太麻烦,所以从代码上来看你只要遵循命名空间规则,该访问到的参数就能访问到。

什么是异步呀