闭包里的变量问题

新手上路,请多包涵

QQ截图20200326144454.png

不懂为什么是undefined,赋值不成功### 问题描述

问题出现的环境背景及自己尝试过哪些方法

火狐浏览器,
没尝试过解决
不理解为什么会这样

相关代码

粘贴代码文本(请勿用截图)

var options = {
                    url:'./server/register.php',
                    method:'post',
                    async:true,
                    params:{userpwd:'123321'},
                    error:function (){
                    },
                    success:function (data){
                        console.log(data);
                    }
                }
                $.ajax(options);

var $ = {
    ajax:function (options) {
        var url = options.url;
        if (!url){
            return fales;
        }
        var method = options.method || 'get',
            async = options.method?true:false,
            callback = options.success || null,
            error = options.error || null,
            params = options.params,
            xhr = createXHR(),
            paramsStr = (function (){
                var temp = params;
                var result = '';
                for (var i in paramsStr){

                    result += i+"="+temp[i]+"&";
                }
                    result.replace(/&$/,'');
                console.log(result);
                return result
            })();
        console.log(options.params);
        debugger
        xhr.onreadystatechange = function (){
            if (xhr.readyState == 4){
                if (xhr.status >=200 && xhr.status <300 || xhr.status == 304){
                    callback && callback(JSON.parse(xhr.responseText));
                }
            }else{
                error && error();
            }
        }
        xhr.open(method,url,async);

        if(method === 'get'){
            url += "?"+paramsStr;
            xhr.send(null);
        }else{
            debugger
            xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
            xhr.send(paramsStr);
        }


        function createXHR() {
            // 如果是IE7以上和其他浏览器,则存在XMLHttpRequest本对象,通过它创建
            if (typeof XMLHttpRequest != undefined) {
                return new XMLHttpRequest;
            } else if (typeof ActiveXObject != undefined) {
                // 将所有ActiveXObject的版本号列出
                var verNumber = ['Microsoft.XMLHTTP', 'MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.5.0',
                    'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP.2.0'];
                // 遍历创建XMLHttpRequest对象
                var len = verNumber.length;
                for (var i; i < len; i++) {
                    try {
                        var xhr = new ActiveXObject(verNumber[i]);
                        break;
                    } catch (e) {

                    }
                    return xhr;
                }
            } else {
                throw new Error('No XHR Object availabel.');
            }
        }


    }
}

你期待的结果是什么?实际看到的错误信息又是什么?

获得那个params的对象

阅读 1.5k
2 个回答

这里不是赋值不成功。

在打断点时,鼠标悬停显示变量值,与当前断点所在作用域有关,temp是在子作用域中,当前作用域中没有,所以显示为undefined

paramsStr = (function(params➊) {
    var temp = params;
    var result = '';
    for (var i in paramsStr) {

        result += i + "=" + temp[i] + "&";
    }
    result.replace(/&$/, '');
    console.log(result);
    return result
})(options.params➊);
  • ➊ 将上下文的params传入,如果params未定义,则传入的值为undefined


这个问题在于对以下语句的理解上了

paramsStr = (function() {
   // 应该避免使用上下文变量
})();

如果想获取上下文的变量params,则需要这样:

var params = 'hebut';
paramsStr = (function(a) {
    console.log(a);
})(params);

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题